2017-05-22 5 views
1

Ich habe Objekt wie folgt:Was ist der Unterschied zwischen setValue und myObject.propertyName in iOS Swift 3.1?

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

Und Instanz von Objekt wie folgt machen:

let instance = Human() 

Und meine Werte wie folgt festgelegt:

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

Und es wie folgt drucken:

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

Alles ist in Ordnung. sondern setzen jetzt meine Werte eine andere Art und Weise wie folgt aus:

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

Erhalten Sie diesen Fehler für Int datatype:

*** Beenden app aufgrund nicht abgefangene Ausnahme 'NSUnknownKeyException' Grund: ‚[setValue : forUndefinedKey:]: Diese Klasse ist für den Schlüsselalter nicht Schlüsselcode-konform.

Warum ist das passiert?
Und wie das zu beheben, weil ich setValue() Funktion verwenden muss.

+1

arbeiten Der Unterschied ist, dass 'instance.name' ist die Eigenschaft, über native Swift Mechanismen zugreifen, während' instance.setValue ("Kirk", forKey: "name") 'erfordert ist Schlüsselwert-Codierung (KVC), was nur funktioniert, wenn die Typen in Objective-C dargestellt werden können. Wie andere darauf hingewiesen haben, kann 'Int!' In Objective-C nicht dargestellt werden, so dass es nicht an KVC teilnehmen kann. Ändern Sie "Alter" von "Int!" Zu "Int" oder "NSNumber!" Und es wird gut funktionieren. (Wenn Sie es in "Int" ändern, müssen Sie sicherstellen, dass es auf einen Nicht-Nil-Wert initialisiert wird, vermutlich mit der Methode "init", die den Wert als Parameter verwendet.) – Rob

+0

Mögliches Duplikat von [Why kann ich KVC nicht von einem Objective-C-Objekt zu einer Swift-Eigenschaft verwenden?] (http://stackoverflow.com/questions/35783888/why-cani-i-not-use-kvc-from-an-objective-c- object-to-a-swift-property) –

Antwort

5

Schlüsselwertcodierung (KVC) basiert auf Objective-C-Funktionalität und Int! ist technisch ein optionaler Werttyp. Optionale Werttypen können in Objective-C nicht dargestellt werden, weshalb der Aufruf fehlschlägt.

Sie können die Übersetzungsfehler sehen, ob Sie ein explizites dynamic Attribut hinzufügen:

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

Es wäre mit Int arbeiten.

Verwenden implizit unverpackte Optionals in diesem Fall ist sowieso eine schlechte Idee. Sie sollten die Eigenschaften als Nicht-Optionen haben und sie in einem Initialisierer initialisieren.

+0

Einige optionale Werttypen (wie 'String!') können in Obj-C dargestellt werden - 'Int' ist einfach problematisch, weil es zu' NSInteger' überbrückt wird und daher keine Möglichkeit, "Null" darzustellen. – Hamish

+0

@Hamish Wahr, es gibt offensichtliche Ausnahmen, bei denen das überbrückte Objekt ein Referenztyp ist (Daten, Arrays, Wörterbücher usw.).). – Sulthan

2

Int! kann nicht wie andere erwähnt int Objective-C dargestellt werden. Dies sollte

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

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

Aktualisiert wie von @Rob vorgeschlagen – Bilal

Verwandte Themen