2016-06-30 8 views
3

次のコードスニペットはblah3とblah4のみを出力し、blah2は出力しないのはなぜですか?NSMutableDictionary isKindOfClass NSDictionaryがfalseです

isKindOfClassは継承を考慮していますが、正確には失敗しているようです。

のObj-C:

NSDictionary *dict = [NSDictionary new]; 
NSMutableDictionary *mutableDict = [NSMutableDictionary new]; 

if([dict isKindOfClass:[mutableDict class]]){ 
    NSLog(@"blah"); //does not print (as expected) 
} 

if([mutableDict isKindOfClass:[dict class]]){ 
    NSLog(@"blah2"); //does not print (unexpected!) 
} 

if([mutableDict isKindOfClass:[mutableDict class]]){ 
    NSLog(@"blah3"); //prints 
} 

if([dict isKindOfClass:[dict class]]){ 
    NSLog(@"blah4"); //prints 
} 

スウィフト:

var dict = NSDictionary() 
var mutableDict = NSMutableDictionary() 
if(dict.isKindOfClass(mutableDict.dynamicType)) {print("blah")} 
if(mutableDict.isKindOfClass(dict.dynamicType)) {print("blah2")} 
if(dict.isKindOfClass(dict.dynamicType)) {print("blah3")} 
if(mutableDict.isKindOfClass(mutableDict.dynamicType)) {print("blah4")} 

Xcodeの7.3.1、iOSの9.3を使用しました。

答えて

3

理由は、NSDictionary.newNSDictionaryを返すことが保証されていないため、そのサブクラスを返すことができます。そして、あなたの言葉は、NSDictionary0のようなサブクラスになります。また、おそらくNSMutableDictionaryMのように、可変クラスのサブクラスがNSMutableDictionaryである可能性があります。

あなたのNSMutableDictionaryは確かにNSDictionaryですが、他のサブクラスを継承しているわけではありません。

代わりにisKindOf:[NSDictionary class]で簡単に確認できます。具体的なオブジェクトのクラスを破棄または検査して驚かせることができます。

編集:あなたが見ることができるように、 enter image description here

両方がNSDictionaryているものの1は、別の「のようなもの」ではありません。ここでは、迅速かつ汚いクラス図です。

これは「クラスクラスタ」と呼ばれ、いくつかのトリッキーな意味を持ちます。 NSStringは、クラスが新入社員が期待していることはまれである別の有名なものです。

+0

あなたの言いたいことはわかりません。 NSMutableDictionaryがNSDictionaryの場合、なぜblah2は印刷されませんか? – user1366911

+0

あなたは 'dict.class'と比較しているからです。しかし、dictは 'NSDictionary'ではなく、そのサブクラスです。 – Eiko

+0

私は2つのIDを持っているusecaseはどうですか?クラスが同じかサブクラスかどうかをチェックしたいのですが。その場合、私はisKindOfClassを使用する必要があります。私は[NSDictionaryクラス]と直接比較できません。これはisKindOfClassの目的ですか? – user1366911

関連する問題