ios - NSMutableDictionary isKindOfClass NSDictionary 为 false

标签 ios objective-c swift nsdictionary

为什么下面的代码片段只打印 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] 轻松检查。您可能想要转储或检查具体对象的类并感到惊讶。

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

如您所见,虽然两者都是 NSDictionary,但两者“有点”不同。

这被称为“类集群”并且有一些棘手的含义。 NSString 是另一个著名的类,其中的类很少是新手所期望的。

关于ios - NSMutableDictionary isKindOfClass NSDictionary 为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38127363/

相关文章:

objective-c - iOS 应用防火墙内容过滤

iphone - 在 App 内购买 AlertMessage

ios - UITableView "Content"字段未出现在 XIB 文件中(Xcode 5 和 6)

iPhone : initing plist field value with the value of another field

objective-c - 在 FTP 下载时获取文件大小

ios - 如何将文本文件放到 iPhone 上?

ios - 为什么 Xcode 不让 outlets unowned 而不是 weak?

ios - 通过 Segue 将文本传递给 TextView

ios - 如何使用 Google API 固定用户的当前位置?

ios - 在 UIButton 中的图像上方添加文本