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

使用contains检查字典数组时遇错误:Contextual type不能与字典字面量混用

问题分析与解决办法

你遇到的错误核心是传错了contains(where:)的参数类型,这个方法需要的是一个闭包(用来检查每个元素是否符合条件),但你直接传了一个字典字面量,类型完全不匹配,所以编译器报错了。

为什么原来的代码不对?

contains(where:)的参数要求是(Element) throws -> Bool类型的闭包——简单说就是,你要给它一个“规则”:拿到数组里的每个元素(这里是字典),返回一个Bool告诉它这个元素是否符合你要找的条件。而你写的([YAngle : ZAngle])是一个字典字面量,不是闭包,编译器自然不知道怎么把它当成检查规则来用。

正确的写法有两种

1. 直接用contains(_:)(推荐,更简洁)

如果你的字典的键和值都是Equatable类型(比如Double,刚好符合你的情况),Swift 4.1及以上版本支持字典的相等比较,所以可以直接用不带where的contains方法,直接传入你要匹配的字典:

let targetDict = [YAngle: ZAngle]
if stored.contains(targetDict) {
    print("This data is already stored")
}

2. 用contains(where:)配合闭包

如果你一定要用contains(where:)(比如需要更复杂的匹配逻辑),要传入一个闭包,用$0代表数组中的每个字典元素,然后判断它是否等于目标字典:

if stored.contains(where: { $0 == [YAngle: ZAngle] }) {
    print("This data is already stored")
}

如果你的匹配逻辑不是完全相等(比如只检查某个键的值),还可以扩展闭包的逻辑,比如:

// 示例:检查数组中是否有字典的YAngle值等于某个特定值
if stored.contains(where: { $0[YAngle] == targetYAngle }) {
    print("Found a dictionary with the target YAngle")
}

内容的提问来源于stack exchange,提问作者coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:38:26