2011-07-20 12 views
5

私はいくつかのXMLを解析しており、私はかなり頻繁に新しい機能を使ってサーバーを更新します。したがって、新しいタグなどを追加すると、currentElementValueがクラスの一部ではないため、データを解析するアプリケーションが呼び出されたときにクラッシュします。とにかく、クラスにプロパティがあるかどうかを確認する必要はありますか?クラスにプロパティがあるかどうかを確認するには?

[a setValue:currentElementValue forKey:elementName]; 

おかげ

答えて

8

あなたが使用することができ、標準のセッターとゲッターの名前をオーバーライドしていない場合:「小道具」と呼ばれるプロパティのセッターメソッドの

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

を、あるいは:

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

のgetterメソッドです。

そうでない場合は、次のような構文を使用している場合:非常にシンプルな

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

プロパティはゲッターとセッターに異なるメソッドを定義する可能性があるため、必ずしも有効ではありません。 –

+2

'@property(assign、getter = isOpen)BOOL open;' - 共通パターン – bshirley

+0

@Jonathan Grynspan:あなたの発言に感謝します。私はより正確にあなたの洞察力を含めるために私の答えを編集! – sergio

18

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

すごく簡単です – Chris

+1

iOSの場合は、ファイルに '#import 'を追加する必要があります – RunLoop

0
プロパティを定義する際に、上記の構文に対応する名前を使用

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

まず、プロパティ名の最初の文字を大文字にする必要があります。

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

次に、プロパティを設定するセレクタを作成する必要があります。 (あなたは、デフォルトで「foo」という呼ばれる性質を持っている場合は、このプロパティのセッターが「setFoo:」と呼ばれます。)

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

はその後セルジオの答えのように、呼び出し:

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

チェックthis postオブジェクトのプロパティを取得する方法を参照してください。

関連する問題