Frage Wie kann man sehen, ob eine Klasse eine Eigenschaft hat?


Ich analysiere etwas XML, und ich aktualisiere den Server ziemlich häufig mit neuen Eigenschaften. Wenn ich also ein neues Tag oder etwas hinzufüge, stürzt meine App, die die Daten analysiert, beim Aufruf ab, weil der currentElementValue noch nicht Teil meiner Klasse ist. Gibt es sowieso, um zu überprüfen, ob eine Klasse eine Eigenschaft hat, oder sollte ich nur die Ausnahme fangen, die ausgelöst wird?

[a setValue:currentElementValue forKey:elementName];

Vielen Dank


5
2017-07-20 16:19


Ursprung


Antworten:


Sehr einfach:

if (class_getProperty([object class], "propertyName")) {
    // it has that property!
}

19
2017-07-20 16:29



Wenn Sie die Standard-Setter- und Getter-Namen nicht überschrieben haben, können Sie Folgendes verwenden:

 if ([object respondsToSelector:@selector(setProp:)]) {

für die Setter-Methode einer Property namens "prop" oder

 if ([object respondsToSelector:@selector(prop)]) {

für seine Getter-Methode.

Andernfalls, wenn Sie eine Syntax wie:

@property (assign, getter=hasProp) BOOL prop;

Verwenden Sie beim Definieren der Eigenschaft den entsprechenden Namen mit der obigen Syntax:

 if ([object respondsToSelector:@selector(hasProp)]) {

8
2017-07-20 16:22



Zuerst müssen Sie den ersten Buchstaben Ihres Eigentumsnamens groß schreiben.

NSString *capitalizedProperty = [NSString stringWithFormat:@"%@%@", [[propertyName substringToIndex:1] uppercaseString], [propertyName substringFromIndex:1]];

Dann müssen Sie einen Selektor erstellen, der die Eigenschaft festlegen würde. (Wenn Sie eine Eigenschaft namens "foo" haben, heißt der Setter für diese Eigenschaft standardmäßig "setFoo:".)

SEL propertySetter = NSSelectorFromString([NSString stringWithFormat:@"set%@:",capitalizedProperty]);

Dann rufen Sie wie in Sergios Antwort an:

if ([object respondsToSelector:propertySetter])
{
    [object setValue:value forKey:propertyName];
}

Prüfen dieser Beitrag um zu sehen, wie man die Eigenschaften eines Objekts erhält.


0
2018-04-11 14:10