Wie Sie sagen, wenn ein Schlüssel vorhanden ist für ein Objekt mit Key-Value-Coding?
Ich würde gerne testen, ob ein Objekt eine schreibbare @Eigenschaft des iPhone SDK.
Eine Möglichkeit, dies zu tun, ist der check -valueForKey: Methode, aber das scheint eher unelegant!
Beispiel:
@try {
id *value = [instance valueForKey:@"myProperty"];
}
@catch (NSException * e) {
//Key did not exist
}
Gibt es einen besseren Weg, dies zu tun?
InformationsquelleAutor der Frage Ted | 2009-12-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie das Objekt erstellt haben, wird überprüft, könnte man überschreiben
valueForUndefinedKey:
undsetValue:forUndefinedKey
etwas zu tun, was mehr als nützlich, eine Ausnahme auszulösen.Wenn auf der anderen Seite, die Sie versuchen zu untersuchen-Objekte, die Sie nicht kennen zur Laufzeit, müssen Sie die runtime-Methoden zu tun. Sie können entweder die objective-c runtime selbst und rufen Sie entweder
class_copyPropertyList
oderprotocol_copyPropertyList
und Umgang mit diesen, oder verwenden Sie Foundation und nennenrespondsToSelector
auf das Objekt, für das KVC-getter/setter für eine bestimmte Eigenschaft, z.B., für eine Eigenschaftfoo
Sie nennen würde, so etwas wie[someObject respondsToSelector:NSSelectorFromString(@"foo")];
.InformationsquelleAutor der Antwort Jason Coco
Gibt es keine Möglichkeit, im Allgemeinen, um zu bestimmen, ob ein Objekt einen Wert hat, der für einen bestimmten Schlüssel. Eine Instanz kann entscheiden, um einen Wert zurückzugeben, für einen ansonsten undefiniert Schlüssel aus seiner
-valueForUndefinedKey:
Methode. Oder kann es lassen Sie die default-Implementierung eine exception werfen. Modern Objective-C (2.0) Objekte oft erklären die relevanten Eigenschaften in seiner öffentlichen API. Für diese Objekte, die Sie verwenden können, die Objective-C runtime istclass_copyPropertyList
oderprotocol_copyPropertyList
um eine Liste der verfügbaren Eigenschaften. Sie können auch emulieren die KVC-Suche Liste, die Prüfung überrepondsToSelector:
wenn die Instanz reagiert auf eine entsprechende getter-Methode. Schließlich könnten Sie die runtimeclass_copyIvarList
zu überprüfen, die ivars für eine angemessene ivar. Dies ist ein viel der Arbeit, die Sie nicht tun sollten. Es wird nicht garantiert, dass Sie wissen, ob ein Objekt Instanz wird eine Ausnahme ausgelöst, wenn an einemvalueForKey:
Nachricht und es gibt ein größeres Problem...Wenn Sie haben eine Sammlung von Objekten, müssen alle stellen einen Wert für einen bestimmten Schlüssel, aber einige nicht, Sie haben ein design-problem. Definieren Sie eine geeignete Schnittstelle (ein
@protocol
in Objective-C), in der Sie deklariert die benötigten Eigenschaften. Sie können dann testen Sie für die Einhaltung dieses Protokolls, oder nutzen Sie den compiler, um einige der compile-Zeit-Typ prüfen für Sie, um sicherzustellen Instanz entsprechen, das Protokoll (wenn Sie vorbei sind um einzelne Instanzen).InformationsquelleAutor der Antwort Barry Wark
Nach @Jason Coco beantworten.
Hier ist mein Angebot, wie Sie überprüfen, speziell für die "set" - Selektoren Existenz der Eigenschaft, die Sie versuchen, zu setzen.
Dies ist pure dreck, aber es funktioniert und ich habe mich selbst gefunden mit. Sie wurden gewarnt..
Verwendung:
Swift:
Fügen Sie das code-snippet auf Ihrer bridging-header:
InformationsquelleAutor der Antwort Chris Birch