为什么下面的代码片段只打印 blah3 和 blah4,而不打印 blah2?
isKindOfClass
应该尊重继承,但它似乎完全没有做到这一点。
objective-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
}
swift :
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
本身——它可以返回它的子类。而您的字典恰好属于 NSDictionary0
这样的子类。此外,可变的可能是 NSMutableDictionary
的子类,例如 NSMutableDictionaryM
。
所以你的 NSMutableDictionary
确实是一个 NSDictionary
,但它不是从其他子类继承的。
您可以使用 isKindOf:[NSDictionary class]
轻松检查。您可能想要转储或检查具体对象的类并感到惊讶。
如您所见,虽然两者都是 NSDictionary
,但两者“有点”不同。
这被称为“类集群”并且有一些棘手的含义。 NSString
是另一个著名的类,其中的类很少是新手所期望的。
关于ios - NSMutableDictionary isKindOfClass NSDictionary 为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38127363/