Codable结构体元素位置追踪:解决firstIndex(of:)报错问题
解决Swift结构体无法使用
firstIndex(of:)的问题 方案一:让Item结构体遵循Equatable协议
Swift的结构体如果所有存储属性都遵循Equatable协议,编译器会自动为其合成Equatable的实现。你只需要:
- 修改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 }
- 确保
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
相关产品推荐
相关产品推荐

