使用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
相关产品推荐
相关产品推荐

