web-dev-qa-db-fra.com

La méthode ne peut pas être marquée @objc car son type de résultat ne peut pas être représenté dans Objective-C

j'expose les API Swift dans les environnements d'exécution Objective-C et Objective-C.

Quand j'ajoute "@objc" avant que la fonction lève une erreur "La méthode ne peut pas être marquée @objc car son type de résultat ne peut pas être représenté dans Objective-C"

Mon code est ici

@objc public static func logIn(_ userId: String) -> User? { }

L'utilisateur est une structure facultative. comment résoudre ceci.

6
SriMa

Le bit d’information clé est le suivant:

L'utilisateur est une structure facultative

Si User est une structure, elle ne peut pas être représentée dans Objective-C, exactement comme une classe Swift qui n'hérite pas de NSObject.

Pour que la méthode logIn(_:) puisse être marquée @objc, chaque type référencé dans la déclaration de la méthode doit pouvoir être représenté dans Objective-C. Vous recevez le message d'erreur parce que User ne l'est pas.

Pour résoudre ce problème, vous devrez soit changer la déclaration de User en ceci:

struct User {
    // ...
}

...pour ça:

class User: NSObject {
    // ...
}

... ou remodelez logIn(_:) pour qu'il ne retourne pas une User.


Vous pouvez trouver plus d'informations à ce sujet ici . En particulier, cette réponse offre la solution potentielle suivante:

La meilleure chose que j'ai trouvée était de faire un cours de box

public class Box<T>: NSObject {
    let unbox: T
    init(_ value: T) {
        self.unbox = value
    }
}
3
Søren Mortensen

Changez la définition de votre classe comme ci-dessous

class User: NSObject {

}

De cette façon, cette classe sera disponible en Objective-C

1

Votre classe ou protocole doit être hérité (étendu) de NSObject ou de toute autre classe de sa hiérarchie, contenant votre code (fonction) avec la notation @objc.

Exemple:

class TestClass {
    public static func logIn(_ userId: String) -> User? { }
}

Pour utiliser/déclarer @objc avec cette fonction, la classe doit étendre NSObject (ou toute autre classe de sa hiérarchie).

class TestClass {
    @objc public static func logIn(_ userId: String) -> User? { }
}

Mettre à jour:

struct peut ne pas fonctionner avec la valeur facultative dans Objective-C. Pour contourner le problème, vous devez changer User de struct à class

Essayez le code suivant et voyez:

public class User : NSObject {
    // Your code
}

public final class Manager : NSObject {

    @objc public static func logIn(_ userId: String) -> User? {
        return nil
    }
}

Voici un instantané avec l'éditeur

 enter image description here

0
Krunal