Swift中元组数组用firstIndex(of:)查索引报错原因求助
问题原因与解决方案
报错原因
Swift 中的元组默认不会自动遵循Equatable协议,哪怕元组内的所有元素都符合Equatable(比如示例里的String)。而firstIndex(of:)方法要求集合元素必须遵循Equatable——因为它需要通过相等性比较定位元素,所以直接调用就会触发类型不匹配的报错。
需要注意:同类型元组之间其实可以直接用==做相等判断(只要元组内每个元素都遵循Equatable),但这种比较能力并没有让元组自动获得Equatable协议一致性,因此无法使用依赖该协议的标准库方法。
解决方案
方案1:改用firstIndex(where:)自定义判断逻辑
不需要修改元素类型,直接通过where参数手动指定相等条件即可,这个方法不要求元素遵循Equatable:
var f: [(String, String)] = [ ("a", "a"), ("b", "b"), ("0", "c"), ("d", "d"), ("e", "e") ] let x = f[0] // 用变量匹配 let index1 = f.firstIndex(where: { $0 == x }) // 直接匹配字面量 let index2 = f.firstIndex(where: { $0 == ("a", "a") })
方案2:用自定义结构体替代元组(适合频繁使用场景)
如果需要多次使用类似的相等性查找,或者想让复合类型正式支持Equatable,可以定义一个遵循Equatable的结构体替换元组:
struct StringPair: Equatable { let left: String let right: String } var f: [StringPair] = [ StringPair(left: "a", right: "a"), StringPair(left: "b", right: "b"), StringPair(left: "0", right: "c"), StringPair(left: "d", right: "d"), StringPair(left: "e", right: "e") ] let x = f[0] // 现在可以正常使用firstIndex(of:) let index = f.firstIndex(of: x)
内容的提问来源于stack exchange,提问作者Hannibal
相关产品推荐
相关产品推荐

