Swift 4.0:如何将NSArray值动态存入NSDictionary及逐个获取元素?
嘿,我来帮你梳理下Swift 4.0里对应的写法,分两个问题给你讲清楚哈:
1. 逐个获取NSArray中的NSDictionary记录
在Swift里操作Objective-C的NSArray和NSDictionary,有两种常见方式:
方式一:直接操作NSArray
和Objective-C的思路类似,但Swift需要做类型转换来保证安全:
// 假设你的NSArray叫arrayName,indexPath是tableView的索引 if let dict = arrayName[indexPath.row] as? NSDictionary { // 拿到了对应的NSDictionary,接下来可以操作它,比如取value let value = dict["keyName"] }
方式二:转成Swift原生数组(推荐)
Swift的原生[[String: Any]](字典数组)比NSArray更安全,语法也更简洁,建议先转成原生类型再操作:
// 先把NSArray转成Swift字典数组,空合运算符处理转失败的情况 let swiftDictArray = arrayName as? [[String: Any]] ?? [] // 直接通过下标获取,因为已经是Swift数组,类型更明确 let dict = swiftDictArray[indexPath.row] // 取值的时候可以更安全地解包 if let value = dict["keyName"] as? String { // 处理字符串类型的值 }
2. 将NSArray的所有值动态存入NSDictionary
这里需要明确一个前提:字典是键值对结构,所以你得确定用什么作为每个元素对应的key。下面分两种常见场景说明:
场景一:用数组索引作为key
如果只是把数组的索引(0、1、2...)作为字典的key,对应的值是数组里的元素,可以这么写:
let nsArray: NSArray = // 你的NSArray实例 let mutableDict = NSMutableDictionary() // 遍历数组,把索引转成字符串当key for (index, element) in nsArray.enumerated() { mutableDict.setObject(element, forKey: "\(index)" as NSCopying) } // 转成不可变的NSDictionary let resultDict = mutableDict.copy() as! NSDictionary
如果用Swift原生的Dictionary(推荐),写法更简洁:
// 先转成Swift数组 let swiftArray = nsArray as? [Any] ?? [] // 直接用Dictionary的初始化方法生成原生字典 let swiftDict = Dictionary(uniqueKeysWithValues: swiftArray.enumerated().map { ("\($0.offset)", $0.element) }) // 要转成NSDictionary的话直接桥接 let nsDict = swiftDict as NSDictionary
场景二:用元素内的某个字段作为key
如果数组里的每个NSDictionary都有一个唯一的标识字段(比如"id"),想用这个字段的值作为字典的key,对应的值是整个NSDictionary,可以这么写:
let nsArray: NSArray = // 你的NSArray实例 let mutableDict = NSMutableDictionary() for element in nsArray { // 先把元素转成NSDictionary,再取出指定的key字段 if let dict = element as? NSDictionary, let uniqueKey = dict["id"] as? NSCopying { mutableDict.setObject(dict, forKey: uniqueKey) } } let resultDict = mutableDict.copy() as! NSDictionary
同样,Swift原生写法更安全:
let swiftArray = nsArray as? [[String: Any]] ?? [] var swiftDict = [AnyHashable: [String: Any]]() for dict in swiftArray { if let uniqueKey = dict["id"] as? AnyHashable { swiftDict[uniqueKey] = dict } } let nsDict = swiftDict as NSDictionary
内容的提问来源于stack exchange,提问作者A.Yesuvin
相关产品推荐
相关产品推荐

