iphone - titel - title tag wordpress




Wie können Sie anhand der Schlüsselwertcodierung feststellen, ob ein Schlüssel für ein Objekt existiert? (2)

Ich möchte testen, ob ein Objekt im iPhone SDK eine beschreibbare @ Eigenschaft hat.

Eine Möglichkeit, dies zu tun, besteht darin, die Methode -valueForKey: zu überprüfen.

Beispiel:

  @try {
    id *value = [instance valueForKey:@"myProperty"];
  }
  @catch (NSException * e) {
    // Key did not exist
  }

Gibt es einen besseren Weg, dies zu tun?


Im Allgemeinen kann nicht festgestellt werden, ob ein Objekt einen Wert für einen bestimmten Schlüssel hat. Eine Instanz kann entscheiden, einen Wert für einen ansonsten undefinierten Schlüssel von ihrer -valueForUndefinedKey: -Methode zurückzugeben. Oder die Standardimplementierung kann eine Ausnahme auslösen. Moderne Objective-C (2.0) -Objekte deklarieren häufig relevante Eigenschaften in ihrer öffentlichen API. Für diese Objekte können Sie die class_copyPropertyList - class_copyPropertyList oder protocol_copyPropertyList der Objective-C-Laufzeit protocol_copyPropertyList , um eine Liste der verfügbaren Eigenschaften class_copyPropertyList . Sie können die KVC-Suchliste auch emulieren, repondsToSelector: über repondsToSelector: ob die Instanz auf eine geeignete Getter-Methode antwortet. Schließlich könnten Sie die class_copyIvarList class_copyIvarList der Laufzeit class_copyIvarList , um die Ivars auf ein entsprechendes Ivar zu überprüfen. Dies ist eine Menge Arbeit, die Sie nicht tun sollten . Es kann nicht garantiert werden, dass Sie wissen, ob eine Objektinstanz beim Senden einer valueForKey: eine Ausnahme valueForKey: , und dass ein größeres Problem angezeigt wird ...

Wenn Sie über eine Sammlung von Objekten verfügen, die alle einen Wert für einen bestimmten Schlüssel angeben müssen, andere jedoch nicht, liegt ein Entwurfsproblem vor. Sie sollten eine geeignete Schnittstelle (ein @protocol in Objective-C) definieren, die die erforderlichen Eigenschaften deklariert. Sie können dann die Konformität mit diesem Protokoll testen oder den Compiler verwenden, um eine Überprüfung der Kompilierungszeit durchzuführen, um sicherzustellen, dass die Instanz dem Protokoll entspricht (wenn Sie einzelne Instanzen umgehen).


Im Anschluss an die Antwort von @Jason Coco.

Hier ist mein Angebot, wie Sie die Existenz der Eigenschaft, die Sie einstellen möchten, gezielt auf "Set-Selektoren" überprüfen.

Das ist reiner Dreck, aber es funktioniert und ich habe es schon gefunden. Du wurdest gewarnt..

NS_INLINE SEL _Nonnull IBPropertySetSelectorForPropertyName(NSString*_Nonnull propertyName)
{

    NSString* firstLetter = [propertyName substringToIndex:1];
    propertyName = [propertyName substringFromIndex:1];

    propertyName = [[NSString alloc] initWithFormat:@"set%@%@:",firstLetter.capitalizedString,propertyName];

    return NSSelectorFromString(propertyName);
}

Verwendungszweck:

Im Handumdrehen: Fügen Sie Ihrem Bridging-Header den Code-Snippet hinzu und

let key = "someKey"    
let sel = IBPropertySetSelectorForPropertyName(key)

if SOMETHING.responds(to: sel) {SOMETHING.setValue(value, forKeyPath: key)}






key-value-coding