首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSMutableDictionary isKindOfClass NSDictionary是假的

NSMutableDictionary isKindOfClass NSDictionary是假的
EN

Stack Overflow用户
提问于 2016-06-30 15:21:14
回答 1查看 792关注 0票数 4

为什么下面的代码片段只打印blah3和blah4,而不打印blah2?

isKindOfClass应该尊重继承,但它似乎确实失败了。

Obj-C:

代码语言:javascript
运行
复制
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
}

斯威夫特

代码语言:javascript
运行
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-30 15:31:26

原因是,NSDictionary.new本身并不保证返回一个NSDictionary -它可以返回它的一个子类。而您的dict恰好属于像NSDictionary0这样的子类。另外,可变的可能是NSMutableDictionary的一个子类,比如NSMutableDictionaryM

因此,您的NSMutableDictionary确实是一个NSDictionary,但它不是从另一个子类继承的。

您可以轻松地使用isKindOf:[NSDictionary class]进行检查。您可能想转储或检查具体对象的类,并感到惊讶。

编辑:下面是一个快速而肮脏的类图:

正如您所看到的,一个不是“某种”另一个,尽管两者都是NSDictionary

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38127363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档