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.
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 } }
Changez la définition de votre classe comme ci-dessous
class User: NSObject {
}
De cette façon, cette classe sera disponible en Objective-C
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? { }
}
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