NSObject转NSMutableDictionary返回nil,转NSDictionary正常,求差异原因
为什么NSObject转NSMutableDictionary?返回nil,但转NSDictionary?能拿到预期值?
这个问题本质是Objective-C的类簇机制加上Swift严格的类型检查共同导致的,我给你拆解明白:
核心原因:Objective-C集合的类簇特性
Objective-C里的NSDictionary和NSMutableDictionary属于类簇——对外只暴露抽象父类,实际运行时创建的是它们的私有子类(比如不可变字典的实际类型是__NSDictionaryI,可变字典是__NSDictionaryM)。
当你写ob as? NSMutableDictionary时,Swift会做严格的运行时类型校验:它会确认ob的实际类型是不是NSMutableDictionary或者它的直接子类。但如果你的ob实际是不可变字典的实例(哪怕你逻辑上觉得它“应该是可变的”),比如__NSDictionaryI,它并不是NSMutableDictionary的子类,所以类型转换直接失败,返回nil。
而转成NSDictionary?时,因为__NSDictionaryI是NSDictionary的子类,完全符合类型转换的条件,所以能顺利拿到预期值。
正确的可变字典转换方式
如果需要得到NSMutableDictionary,别直接强转,正确的做法是先转成不可变字典,再调用mutableCopy():
// 安全的转换流程 if let immutableDict = ob as? NSDictionary { let mutableDict = immutableDict.mutableCopy() as! NSMutableDictionary // 这里就可以正常使用可变字典了 }
更推荐的方式是用Swift原生集合类型桥接:
if let swiftDict = ob as? [AnyHashable: Any] { let mutableDict = NSMutableDictionary(dictionary: swiftDict) }
小提醒
Swift和Objective-C桥接时,尽量优先用Swift原生的集合类型(比如[Key: Value]),而非直接依赖Objective-C的可变集合类,能避开不少类簇带来的类型检查坑。
内容的提问来源于stack exchange,提问作者A_G
相关产品推荐
相关产品推荐

