为什么下面的代码片段只打印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。
答案 0 :(得分:3)
原因是,NSDictionary.new
不能保证返回NSDictionary
本身 - 它可以返回它的子类。而你的dict恰好是NSDictionary0
之类的子类。此外,可变的可能是NSMutableDictionary
的子类,如NSMutableDictionaryM
。
因此,您的NSMutableDictionary
确实是NSDictionary
,但不是它不会从其他子类继承。
您可以轻松查看isKindOf:[NSDictionary class]
。您可能想要转储或检查具体对象的类并感到惊讶。
正如你所看到的,一个不是"有点"另一个,虽然两者都是NSDictionary
。
这被称为"类集群"并且有一些棘手的含义。 NSString
是另一个着名的课程,其中的课程很少是新人期望的。