Swift中如何检查函数参数Int值是否在指定数组中?(附报错代码)
解决Swift中判断数值是否存在于Any数组的错误
错误原因分析
你写的代码里,arr.contains(where: num)这一行出错了,因为contains(where:)方法要求传入的参数是一个闭包,类型为(Any) throws -> Bool,用来对数组中的每个元素进行判断;但你直接传入了Int类型的num,类型不匹配,所以编译器报错。
另外还要注意:你的数组类型是Array<Any>,而Any并没有遵守Equatable协议,所以没法直接用contains(_:)方法(这个方法要求元素类型遵守Equatable)。
修正后的代码
我们需要在contains(where:)里传入一个闭包,先判断数组中的元素是否是Int类型,再和目标数值比较:
func check(num: Int, arr: Array<Any>) -> Bool { return arr.contains { element in guard let intElement = element as? Int else { return false } return intElement == num } } // 调用测试 check(num: 7, arr: [1, 4, 7, 25, 99]) // 返回true check(num: 5, arr: [1, "a", 7]) // 返回false
也可以简化闭包的写法:
func check(num: Int, arr: Array<Any>) -> Bool { return arr.contains { $0 as? Int == num } }
优化方案:使用泛型让函数更通用
如果你的数组元素类型固定(比如都是Int),可以用泛型来让函数支持任意遵守Equatable的类型,同时避免Any带来的类型判断开销:
func check<T: Equatable>(num: T, arr: [T]) -> Bool { return arr.contains(num) } // 调用测试 check(num: 7, arr: [1, 4, 7, 25, 99]) // 返回true check(num: "apple", arr: ["banana", "apple", "orange"]) // 也支持字符串类型
这样函数的复用性更强,类型更安全,代码也更简洁。
内容的提问来源于stack exchange,提问作者Guga Peranidze
相关产品推荐
相关产品推荐

