Ios NSMutableDictionary是类NSDictionary是false
为什么下面的代码片段只打印blah3和blah4,而不打印blah2Ios 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
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类的目的,否?@EikoNSMutableDictionary
是NSDictionary
的子类,因此isKindOf
将返回true
,并且应该打印blah2
。添加了更多的解释和图表。