web-dev-qa-db-fra.com

Swift 4 "Cette classe n'est pas conforme au codage des valeurs clés"

J'ai une bibliothèque Swift qui dépend fortement de obj.valueForKey() de NSObject.

Après la migration vers Swift 4, j'ai constaté que ces appels se bloquent toujours avec l'erreur "cette classe n'est pas conforme au codage de la valeur de clé pour la clé ..." sauf si la propriété que je recherche pour est déclaré avec @objc.

Est-il désormais obligatoire de déclarer des propriétés avec @objc pour les trouver avec cette méthode? Y a-t-il une alternative?

24
user1537360

Lorsque vous avez effectué la migration, Xcode a demandé des informations sur @objc inférence et vous avez probablement sélectionné le nouveau type au lieu de Swift3.

Solutions possibles:

Utilisation @objc

Utilisation @objc sur chaque méthode, au besoin, au lieu de la classe entière.

Utilisation @objcMembers

Vous pouvez simplement utiliser @objcMembers sur la classe.

L'application de l'attribut @objcMembers à une classe ajoute implicitement l'attribut @objc à tous ses membres compatibles Objective-C.

Écriture Swift Classes et protocoles avec comportement Objective-C

Gardez à l'esprit: car l'application de l'attribut @objc peut augmenter la taille compilée d'une application et nuire aux performances, n'appliquer l'attribut @objcMembers sur les déclarations que lorsque chaque membre doit avoir l'attribut @objc appliqué .

Basculer l'inférence sur l'ancien comportement

Vous pouvez également modifier le comportement du projet sous: Build Settings> Swift 3 @objc Inference> On/Off

Questions connexes:

59
nathan