NSMutableDictionary isKindOfClass NSDictionary为false

时间:2016-06-30 15:21:15

标签: 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"); //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。

1 个答案:

答案 0 :(得分:3)

原因是,NSDictionary.new不能保证返回NSDictionary本身 - 它可以返回它的子类。而你的dict恰好是NSDictionary0之类的子类。此外,可变的可能是NSMutableDictionary的子类,如NSMutableDictionaryM

因此,您的NSMutableDictionary确实是NSDictionary,但不是它不会从其他子类继承。

您可以轻松查看isKindOf:[NSDictionary class]。您可能想要转储或检查具体对象的类并感到惊讶。

编辑:这是一个快速而又脏的类图: enter image description here

正如你所看到的,一个不是"有点"另一个,虽然两者都是NSDictionary

这被称为"类集群"并且有一些棘手的含义。 NSString是另一个着名的课程,其中的课程很少是新人期望的。