2017-05-22 1 views
1

Je objet comme ceci:Quelle est la différence entre setValue et myObject.propertyName dans iOS Swift 3.1?

class Human: NSObject { 
    var name:String! 
    var age:Int! 
} 

Et fais exemple de l'objet comme celui-ci:

let instance = Human() 

Et mis mes valeurs comme ceci:

instance.name = "Kirk" 
instance.age = 87 

et l'imprimer comme ceci:

print("name: \(instance.name)") // Kirk 
print("age: \(instance.age)") //87 

Tout est OK. mais maintenant définir mes valeurs d'une autre manière comme ceci:

instance.setValue("Kirk", forKey: "name") 
instance.setValue(87, forKey: "age") 

Obtenir cette erreur pour Int dataType:

*** en raison de l'application Mettre fin exception uncaught 'NSUnknownKeyException', la raison: « [setValue : forUndefinedKey:]: cette classe n'est pas compatible avec le codage de valeur de clé pour l'âge de clé. '

Pourquoi cela est-il arrivé?
Et comment résoudre ce problème, car j'ai besoin d'utiliser la fonction setValue().

+1

La différence est que 'instance.name' est l'accès à la propriété par l'intermédiaire des mécanismes natifs Swift, alors que' instance.setValue (« Kirk », forKey: « nom ») 'est la clé de codage nécessite valeur (KVC), ce qui ne fonctionne que si les types peuvent être représentés en Objective-C. Comme d'autres l'ont souligné, 'Int! 'Ne peut pas être représenté en Objective-C, donc il ne peut pas participer à KVC. Changez 'age' de' Int! 'À' Int' ou 'NSNumber!', Et ça marchera très bien. (Clairement si vous le changez en 'Int', vous devrez vous assurer qu'il est initialisé à une valeur non-' nil', vraisemblablement avec la méthode 'init' qui prend la valeur en paramètre.) – Rob

+0

Possible duplicate of [Pourquoi? ne puis-je pas utiliser KVC d'un objet Objective-C à une propriété Swift?] (http://stackoverflow.com/questions/35783888/why-can-i-not-use-kvc-from-an-objective-c- object-to-a-swift-property) –

Répondre

5

Le codage de valeur-clé (KVC) repose sur la fonctionnalité Objective-C et le type Int! est techniquement un type de valeur optionnel. Les types de valeur facultatifs ne peuvent pas être représentés dans Objective-C et c'est pourquoi l'appel échoue.

Vous pouvez voir l'erreur de compilation si vous ajoutez un attribut explicite dynamic:

class Human: NSObject { 
    var name:String! 
    dynamic var age: Int! 
} 

Il travaillerait avec Int. L'utilisation implicite des options non emballées dans ce cas est une mauvaise idée de toute façon. Vous devriez avoir les propriétés comme non-optionnelles et les initialiser dans un initialiseur.

+0

Certains types de valeur optionnels (tels que 'String!') peuvent être représentés dans Obj-C - 'Int' car c'est un problème car il est lié à' NSInteger' et n'a donc pas de façon de représenter «néant». – Hamish

+0

@Hamish Vrai, il existe des exceptions évidentes où l'objet ponté est un type de référence ('Data', tableaux, dictionnaires etc.). – Sulthan

2

Int! ne peut pas être représenté dans Objective-C comme mentionné précédemment. Cela devrait fonctionner

class Human: NSObject { 
    var name:String! 
    var age : Int; 

    init(name:String?, age:Int) { 
     self.age = age 
     self.name = name 
    } 
} 
+0

Mis à jour comme suggéré par @Rob – Bilal