2011-10-25 7 views

答えて

84
if([obj isKindOfClass:[NSArray class]]){ 
    //Is array 
}else if([obj isKindOfClass:[NSDictionary class]]){ 
    //is dictionary 
}else{ 
    //is something else 
} 
12

これらの両方がBOOL値を返す必要があります

[myObject isKindOfClass:[NSArray class]] 

[myObject isKindOfClass:[NSDictionary class]] 

を試してみてください。これは、NSObjectの方法の基本的な使用である: In Objective-C, how do I test the object type?

8

あなたはJSONまたはXMLからのデータを解析している場合を考えてみましょう:少し詳しく

-(BOOL)isKindOfClass:(Class)aClass 

、ここでこの答えを見ます応答。使用している解析ライブラリによっては、NSArraysまたはNSDictionariesで終わることはありません。代わりに、__NSCFArrayまたは__NSCFDictionaryを持つことができます。念のために

if([unknownObject respondsToSelector:@selector(lastObject)]){ 

// You can treat unknownObject as an NSArray 
}else if([unknownObject respondsToSelector:@selector(allKeys)]){ 

// You can treat unknown Object as an NSDictionary 
} 
+2

-1多くのオブジェクトが応答することができる:それは同時に所望のタイプにそれらをキャストするだけでなく、それはタイプをチェックしないので、私見、より多くのエレガントなObjective-Cのバージョンよりもですが、それは同じセレクタ、特に 'lastObject'や' allKeys'と同じようなものです。 'isKindOfClass:'を使うことは、 'NSArray'や' NSDictionary'のようなクラスクラスタを扱う際の明確な方法です。 – Calrion

+1

その答えは全然ナンセンスです。 [myObject isKindOfClass:[NSArray class]]は "myObjectがNSArrayであるかのように振る舞いますか"という質問に正しく答えるので、それはあなたが望むものです。 NSArrayまたはNSDictionaryだけが応答するセレクタはありません。 2分で、インスタンスメソッド "allKeys"と "lastObject"でクラスを作成できます。または、NSArrayにカテゴリメソッドとして「allKeys」を追加します。 – gnasher729

0

:その場合は

、あなたは配列や辞書を持っているかどうかをチェックするための最良の方法は、それが唯一の配列や辞書に応答するセレクタに応答するかどうかを確認することです誰でもこのパーティーに遅れて来て、スウィフトの同等物を探しています、ここに行きます。

if let arrayVersion = obj as? NSArray { 
    // arrayVersion is guaranteed to be a non-`nil` NSArray 
} else if let dictionaryVersion = obj as? NSDictionary { 
    // dictionaryVersion is guaranteed to be a non-`nil` NSDictionary 
} else { 
    // it's neither 
} 
関連する問題