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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:50:22