You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

额外提醒

  1. 永远别乱用强制解包(!),用if let或者guard let做可选绑定,能避免很多不必要的崩溃;
  2. 顺便检查下你的搜索过滤逻辑,是不是不小心把字典转成数组了?正常来说如果原始数据源是字典数组,过滤后的结果也应该保持每个元素是字典类型。

内容的提问来源于stack exchange,提问作者Prathap Reddy Jakkireddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:34:36