2016-04-12 7 views
-1

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?

+0

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

+0

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

Antwort

0

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:

  1. 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.

  2. 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.

    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.
+0

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

+0

Ich bin sicher, dass sie alle mit ein wenig Forschung möglich sind. – Slayter

+1

Eigentlich kann man das in Pure Swift nicht machen. Wenn du die ObjC-Laufzeit mit dir hast, dann ist es genau derselbe Code. –

Verwandte Themen