Swift 4搜索栏过滤问题:__NSDictionaryM转NSArray类型转换错误如何解决?
解决Swift 4中搜索栏过滤的类型转换错误
这个错误其实很好定位——你代码里强行把filteredArray里的元素转成NSArray,但实际上这个元素是可变字典类型(__NSDictionaryM),类型完全不匹配,自然就抛出崩溃了。
怎么修改?
首先你得明确:你的filteredArray里存的是字典对象,不是数组对象,所以要把类型转换改成字典相关的:
推荐用Swift原生集合类型(更安全)
尽量少用NSArray/NSDictionary这类Foundation类型,换成Swift原生的[Dictionary]会更符合Swift的类型安全特性:
// 先通过可选绑定安全获取filteredArray,确认它是字典数组 if let filteredArray = self.filteredArray as? [Dictionary<String, Any>] { // 取出对应位置的字典 let selectedDict = filteredArray[indexPath.row] // 接下来就可以根据键取值了,比如取字符串类型的"title"字段 if let title = selectedDict["title"] as? String { // 处理title } }
如果非要用Foundation类型
如果你的项目里还是习惯用NSDictionary,可以这么改:
if let filteredArray = self.filteredArray as? [NSDictionary] { let selectedDict = filteredArray[indexPath.row] // 比如通过key取值 let title = selectedDict.object(forKey: "title") as? String }
额外提醒
- 永远别乱用强制解包(
!),用if let或者guard let做可选绑定,能避免很多不必要的崩溃; - 顺便检查下你的搜索过滤逻辑,是不是不小心把字典转成数组了?正常来说如果原始数据源是字典数组,过滤后的结果也应该保持每个元素是字典类型。
内容的提问来源于stack exchange,提问作者Prathap Reddy Jakkireddy
相关产品推荐
相关产品推荐

