Ios NSMutableDictionary是类NSDictionary是false

Ios NSMutableDictionary是类NSDictionary是false,ios,objective-c,swift,nsdictionary,Ios,Objective C,Swift,Nsdictionary,为什么下面的代码片段只打印blah3和blah4,而不打印blah2 isKindOfClass应该尊重继承,但它似乎恰恰没有做到这一点 Obj-C: NSDictionary *dict = [NSDictionary new]; NSMutableDictionary *mutableDict = [NSMutableDictionary new]; if([dict isKindOfClass:[mutableDict class]]){ NSLog(@"blah"); //do

为什么下面的代码片段只打印blah3和blah4,而不打印blah2

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

原因是,
NSDictionary.new
不保证返回
NSDictionary
本身-它可以返回它的子类。而您的dict恰好属于一个子类,如
NSDictionary0
。另外,可变字典可能是
NSMutableDictionary
的一个子类,比如
NSMutableDictionaryM

因此,您的
NSMutableDictionary
确实是一个
NSDictionary
,但它不是从另一个子类继承的

您可以使用
isKindOf:[NSDictionary类]
轻松检查。您可能希望转储或检查具体对象的类,并对此感到惊讶

编辑:这是一个快速而肮脏的类图:

正如您所看到的,一个不是“某种”另一个,尽管两者都是
NSDictionary


这被称为“类集群”,有一些棘手的含义
NSString
是另一个著名的例子,其中的类很少是新手所期望的。

不知道你在说什么。如果NSMutableDictionary是NSDictionary,为什么blah2不打印呢?因为您正在与
dict.class
进行比较。但是dict不是NSDictionary,而是它的一个子类。如果我有两个id,我想检查这些类是相同的还是一个子类,那么这个用例怎么样。在这种情况下,我需要使用的是类。我无法直接与[NSDictionary类]进行比较。这就是isKindOf类的目的,否?@Eiko
NSMutableDictionary
NSDictionary
的子类,因此
isKindOf
将返回
true
,并且应该打印
blah2
。添加了更多的解释和图表。