Swift过滤对象数组遇报错:尾随闭包传入不接受闭包的Predicate参数
问题解决
核心错误点
你的代码存在两个关键问题,直接导致了这个错误提示:
- 数组元素访问错误:
MultiLineChartData的data属性是数组类型[(day: Date, amount: Int)],你直接写$0.data.day完全不合法——数组本身没有day属性,必须遍历数组内的元素才能获取日期值。 - 类型推断失败引发误导提示:Xcode显示的“不接受闭包”其实是类型推断出错的连锁反应。因为闭包里的错误代码让Swift无法识别你要调用的是标准库的
filter(_:)方法,反而误匹配了其他框架(比如Core Data)里的同名类型或方法。
修正后的代码
根据需求不同,提供两种常见场景的修正方案:
场景1:保留data数组中存在匹配日期的MultiLineChartData对象
static func getEntriesFromSelection(_ data: [MultiLineChartData], selectedDay: Date) -> [MultiLineChartData] { let searchDay = dateSearchFormat.string(from: selectedDay) return data.filter { chartData in // 检查当前对象的data数组中是否有日期匹配的元素 chartData.data.contains { entry in dateSearchFormat.string(from: entry.day) == searchDay } } }
场景2:过滤每个对象的data数组,仅保留匹配日期的元素
static func getEntriesFromSelection(_ data: [MultiLineChartData], selectedDay: Date) -> [MultiLineChartData] { let searchDay = dateSearchFormat.string(from: selectedDay) return data.map { chartData in var filteredChart = chartData filteredChart.data = chartData.data.filter { entry in dateSearchFormat.string(from: entry.day) == searchDay } return filteredChart }.filter { !$0.data.isEmpty } // 可选:移除过滤后data数组为空的对象 }
额外排查点
如果修正后仍报错,检查以下情况:
- 是否导入了
Core Data框架,其中的Predicate类型和Swift标准库闭包产生命名冲突,可尝试显式调用标准库方法:return Swift.data.filter { ... } - 代码中是否自定义了名为
filter的方法/属性,覆盖了数组的默认方法
内容的提问来源于stack exchange,提问作者Neglected Sanity
相关产品推荐
相关产品推荐

