为什么下面的代码片段只打印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。
发布于 2016-06-30 15:31:26
原因是,NSDictionary.new
本身并不保证返回一个NSDictionary
-它可以返回它的一个子类。而您的dict恰好属于像NSDictionary0
这样的子类。另外,可变的可能是NSMutableDictionary
的一个子类,比如NSMutableDictionaryM
。
因此,您的NSMutableDictionary
确实是一个NSDictionary
,但它不是从另一个子类继承的。
您可以轻松地使用isKindOf:[NSDictionary class]
进行检查。您可能想转储或检查具体对象的类,并感到惊讶。
编辑:下面是一个快速而肮脏的类图:
正如您所看到的,一个不是“某种”另一个,尽管两者都是NSDictionary
。
这被称为“类集群”,并有一些棘手的含义。NSString
是另一个著名的类,它很少像新手所期望的那样。
https://stackoverflow.com/questions/38127363
复制相似问题