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

Codable结构体元素位置追踪:解决firstIndex(of:)报错问题

解决Swift结构体无法使用firstIndex(of:)的问题

方案一:让Item结构体遵循Equatable协议

Swift的结构体如果所有存储属性都遵循Equatable协议,编译器会自动为其合成Equatable的实现。你只需要:

  1. 修改Item的协议声明,添加Equatable:
struct Item: Codable, Equatable {
    // 原结构体属性保持不变
    let uniqueId: String
    let id: String
    let productId: String
    let name: String
    let price: String
    let listPrice: String
    let sellingPrice: String
    let totalRow: String
    let additionalInfo: AdditionalInfo
    let productCategoryIds: String
    let productCategories: [String: String]
    var quantity: Int
    let seller: String
    let imageUrl: String
    let detailUrl: String
    let availability: String
    let measurementUnit: String
    let unitMultiplier: Double
}
  1. 确保AdditionalInfo结构体也遵循Equatable(如果它的所有属性都符合Equatable,同样可以自动合成实现):
struct AdditionalInfo: Codable, Equatable {
    // 原属性内容
}

完成后,你原来的firstIndex(of:)代码就能正常运行,同时还能直接用==比较两个Item实例是否相等。

方案二:使用firstIndex(where:)通过唯一标识查找

如果不想让Item遵循Equatable,或者某些属性难以实现Equatable,可以利用uniqueId(从命名看是唯一标识)精准匹配,改用firstIndex(where:):

let index = orderForm?.items.firstIndex { $0.uniqueId == item.uniqueId } ?? 0

这种方式不需要修改结构体的协议遵循,直接通过闭包指定匹配条件,适合只在这个特定场景下查找索引的需求,灵活性更高。


内容的提问来源于stack exchange,提问作者Christian Pérez - SMU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:55:20