如何将[AnyHashable: Any]转换为NSMutableDictionary?
Swift [AnyHashable: Any] 转 NSMutableDictionary 混编适配方案
核心避坑提醒
- 绝对不要直接用
swiftDict as! NSMutableDictionary或者as? NSMutableDictionary做强制转换:Swift原生字典桥接到Objective-C层默认是不可变的NSDictionary类型,这种强转得到的对象本质还是不可变字典,后续调用setObject:forKey:、removeObjectForKey:等修改方法时会直接触发unrecognized selector崩溃,是混编场景的高频踩坑点。
场景1:字典值均为可桥接基础类型
如果你的字典存储的值都是String、Int、Bool、Array、Dictionary这类可以自动桥接为Foundation类型的内容,没有自定义Swift专属类型(结构体、枚举、未标记@objc的Swift类),用下面的方式做安全转换:
let swiftDict: [AnyHashable: Any] = ["userName": "ZhangSan", "age": 25, "isVip": true] // 先显式生成不可变NSDictionary,再创建可变副本 guard let mutableDict = NSDictionary(dictionary: swiftDict).mutableCopy() as? NSMutableDictionary else { // 转换失败兜底逻辑,比如存在无法桥接的类型时的处理 return } // 后续可以直接把mutableDict传给Objective-C方法使用,支持增删改操作
场景2:包含嵌套结构/自定义类型
如果字典里有多层嵌套的字典、数组,或者自定义Swift类型,直接桥接会出现值识别失败、nil的问题,可以通过扩展做递归转换,提前把所有内容处理成ObjC可识别的类型:
extension Dictionary where Key == AnyHashable, Value == Any { func convertToNSMutableDictionary() -> NSMutableDictionary { let result = NSMutableDictionary() for (key, value) in self { switch value { case let nestedDict as [AnyHashable: Any]: // 递归处理嵌套字典 result[key] = nestedDict.convertToNSMutableDictionary() case let nestedArr as [Any]: // 处理嵌套数组 result[key] = nestedArr.map { element in if let subDict = element as? [AnyHashable: Any] { return subDict.convertToNSMutableDictionary() } // 此处可追加自定义类型转换逻辑,比如把Swift模型转成NSDictionary return element } default: // 基础可桥接类型直接赋值 result[key] = value } } return result } } // 调用示例 let objcMutableDict = yourSwiftDict.convertToNSMutableDictionary()
注意:所有传递给Objective-C层的对象必须是NSObject子类,或者可以自动桥接为Foundation类型的Swift原生值类型。如果是自定义的Swift结构体、枚举,需要手动转换为NSDictionary、NSString、NSNumber这类基础ObjC可识别类型,否则会出现取值为nil、调用崩溃的问题。
内容的提问来源于stack exchange,提问作者Snowtown123
相关产品推荐
相关产品推荐

