Swift 4:对标OC实现NSArray转NSDictionary及按键取值
Swift 4 实现 Objective-C 字典取值逻辑
嘿,我来帮你把这段Objective-C的字典取值逻辑转成Swift 4的写法~先给你理清楚核心逻辑:咱们要从数组里取出对应位置的字典,再通过customer_name这个键拿到值,最后赋值给cell的name文本。因为Swift是类型安全的语言,所以咱们得做一些安全处理,避免运行时崩溃。
第一步:从NSArray中安全获取字典对象
首先注意下你声明的var leadsArray = [NSArray]()——如果你的数组里装的是字典对象,那这个声明可能有点问题(这是“数组里装数组”的类型),正确的应该是var leadsArray: NSArray = [](或者更Swift风格的[NSDictionary])。不过先按你给出的变量来演示:
要从leadsArray里取出对应indexPath.row位置的字典,咱们得先拿到元素,再做安全的类型转换:
// 先取出对应索引的元素,再转换为NSDictionary,转换失败就做容错处理 guard let dictValue = leadsArray.object(at: indexPath.row) as? NSDictionary else { // 比如给个空字符串,避免cell显示nil cell.name.text = "" return }
第二步:从NSDictionary中按键取值
接下来就是从字典里拿customer_name的值啦,同样要做类型转换,因为NSDictionary的取值返回的是Any?,得转成String才能赋值给label的text:
// 两种写法都可以,选你习惯的就行 // 方式一:沿用NSDictionary的value(forKey:)方法 cell.name.text = dictValue.value(forKey: "customer_name") as? String ?? "" // 方式二:更Swift化的下标访问 cell.name.text = dictValue["customer_name"] as? String ?? ""
额外的Swift风格优化建议
其实在Swift里,更推荐用原生的Array和Dictionary类型,而不是NSArray/NSDictionary,这样类型更安全,写法也更清爽。比如你可以把变量声明改成:
// 声明一个装字典的数组,键是String类型,值可以是Any(如果知道具体类型可以写得更精确) var leadsArray: [[String: Any]] = []
然后取值的代码可以更简洁,还能避免数组越界的问题:
// 先自定义一个safe下标,防止数组越界崩溃 extension Collection { subscript(safe index: Index) -> Element? { return indices.contains(index) ? self[index] : nil } } // 然后安全取值 guard let dictValue = leadsArray[safe: indexPath.row], let customerName = dictValue["customer_name"] as? String else { cell.name.text = "" return } cell.name.text = customerName
内容的提问来源于stack exchange,提问作者A.Yesuvin
相关产品推荐
相关产品推荐

