Ich frage, weil ich diese Funktion separat in eine Klasse implementieren möchte. Ich könnte natürlich nur von NSObject erben, aber da es wirklich nur eine Methode ist, die ich möchte, würde ich es hassen, all diesen anderen Müll in meine Objekte zu bekommen.Wie wird NSObject.setValue (Wert: AnyObject ?, forKey key: String) implementiert?
Antwort
Von Befehl + Klicken auf die Methode:
einen Wert und einen Schlüssel, der ein Attribut identifiziert, stellen Sie den Wert des Attributs. Bei einem Objekt und einem Schlüssel, der eine Eins-zu-Eins-Beziehung angibt, verknüpfen Sie das Objekt mit dem Empfänger und verknüpfen Sie das zuvor verknüpfte Objekt, falls eines vorhanden war. Geben Sie bei einem Auflistungsobjekt und einem Schlüssel, der eine Zu-Viele-Beziehung angibt, die in der Auflistung enthaltenen Objekte an den Empfänger an und verknüpfen Sie zuvor verwandte Objekte, falls vorhanden.
Die Standardimplementierung dieser Methode führt Folgendes aus:
Sucht die Klasse des Empfängers für eine Accessor-Methode, deren Name dem Muster -Set :. Wenn eine solche Methode gefunden wird, wird der Typ des Parameters überprüft. Wenn der Parametertyp kein Objektzeigertyp ist, aber der Wert nil -setNilValueForKey lautet: ist aufgerufen. Die Standardimplementierung von -setNilValueForKey: löst eine NSInvalidArgumentException aus, die Sie jedoch in Ihrer -Anwendung überschreiben können. Andernfalls, wenn der Typ des Methodenparameters ein Objekt-Zeigertyp ist, wird die Methode einfach mit dem Wert als Argument aufgerufen. Wenn der Typ des Methodenparameters ein anderer Typ ist, wird die Inverse der NSNumber/NSValue-Konvertierung von -valueForKey: durchgeführt, bevor die Methode aufgerufen wird.
Im anderen Fall (kein Accessormethode gefunden wird), wenn die Klasse des Empfängers + accessInstanceVariablesDirectly Methode JA zurückgibt, sucht die Klasse des Empfängers für eine Instanzvariable, deren Name das Muster _, _is, oder ist, in dieser Reihenfolge. Wenn eine solche Instanzvariable gefunden wird und ihr Typ ein Objektzeiger ist Typ der Wert bleibt erhalten und das Ergebnis wird in der Instanz Variable gesetzt, nachdem der alte Wert der Instanzvariablen zuerst freigegeben wurde. Wenn der Typ des Instanzvariable ist ein anderer Typ sein Wert nach der gleichen Art von Umwandlung von NSNumber oder NSValue wie in Schritt 1.
- Andernfalls (NEIN Accessormethode gesetzt ist oder Instanzvariable gefunden), ruft -setValue: forUndefinedKey: auf. Die Standardimplementierung von -setValue: forUndefinedKey: löst eine NSUndefinedKeyException aus, aber können Sie sie in Ihrer Anwendung überschreiben.
Das ist alles gut und schön, aber ich habe keine Ahnung, wie ich das alles in Swift machen soll. Sind diese Dinge überhaupt möglich? Ich dachte, du könntest nicht einmal die Methoden eines Objekts in schnellen reflektieren ... – Evert
Ich bin sicher, dass sie alle mit ein wenig Forschung möglich sind. – Slayter
Eigentlich kann man das in Pure Swift nicht machen. Wenn du die ObjC-Laufzeit mit dir hast, dann ist es genau derselbe Code. –
- 1. NSManagedObject.setValue (Wert: ANYOBJECT ?, forKey key: String) verursacht Fehler in Swift 2.0
- 2. Wert kann nicht vom Typ umwandeln '[NSObject: ANYOBJECT]' zu erwarteten Argumenttyp '[String: ANYOBJECT]'
- 3. iOS Swift Wert von [String: ANYOBJECT]
- 4. ein [String: ANYOBJECT] zuweisen [String: ANYOBJECT] in Swift ersetzt
- 5. Konvertieren von [NSObject, AnyObject] in [String, AnyObject] in Swift
- 6. Swift AnyObject - Down-Casting eines Arrays von Protokollen zu [AnyObject]
- 7. Hat [NSMutableDictionary setValue: value forKey: key] den NSString-Schlüssel beibehalten?
- 8. CKRecord setValue: forKey oder setObject: forKey
- 9. Fehler beim Aufruf self.setValue (: :) forKey
- 10. Casting String zu [NSObject: AnyObject]
- 11. Wert kann nicht vom Typ zuordnen '[[String: ANYOBJECT]]' eingeben '[[Zeichenfolge: ANYOBJECT]]'
- 12. Wert kann nicht vom Typ zuordnen ‚[String: ANYOBJECT]
- 13. Wie wird Serializable implementiert?
- 14. Wie wird __RTC_CheckEsp implementiert?
- 15. Kann den Wert vom Typ '[String: String?]' Nicht in den erwarteten Argumenttyp '[String: AnyObject?]' Konvertieren
- 16. Verwenden von SetValue (Wert, forKey: Schlüssel) auf Int? Typen feuert Nicht-Schlüsselwert Kodierung-konforme Methode
- 17. Swift NSUserDefaults setString: forKey :?
- 18. Kann keinen Wert vom Typ '[String: AnyObject]' mit einem Index vom Typ 'String' subsummieren.
- 19. Wie wird OpenID implementiert?
- 20. Wie wird set() implementiert?
- 21. Wie wird pthread_join implementiert?
- 22. Wie wird @private implementiert?
- 23. Swift - Konvertieren eines AutoreleasingUnsafeMutablePointer <AnyObject?> Wert
- 24. '(NSObject, AnyObject)' ist nicht in 'String' konvertierbar
- 25. Kann nicht den Typ umwandeln [NSObject: ANYOBJECT] string
- 26. Kann den Wert vom Typ '[String: String?]' Nicht in den erwarteten Argumenttyp '[NSObject: AnyObject]?' Konvertieren. '
- 27. Typ '(String, AnyObject)' hat keine tiefgestellten Mitglieder
- 28. Wörterbuch deklarieren [String: AnyObject] mit überlaufenden Ganzzahlen
- 29. Wie Wert von Key in List <Dictionary <string, string >> in C#
- 30. Swift AnyObject Konvertierung
Es ist generell eine gute Idee von 'NSObject' Unterklasse beim Anlegen neue Objekte, weil alles, was andere„Junk“wirklich nützlich sein könnte. – Slayter
Das hängt wirklich von den eigenen Zielen ab und für meine Zwecke möchte ich eine bestimmte Klasse erstellen, die das Minimum an Methoden hat, so dass andere Leute sie ableiten können und alles tun können, was sie damit machen wollen. – Evert