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

SwiftUI ForEach identified(by:)已弃用,如何改用ForEach(_:id:)?

解决ForEach.identified(by:)弃用问题,改用ForEach(_:id:)

嗨,我来帮你搞定这个SwiftUI的小改动!在Xcode 11 beta 4之后,ForEach.identified(by:)确实被官方弃用了,取而代之的是更简洁的ForEach(_:id:)初始化器,修改起来非常直接,我给你拆解一下:

直接修改现有代码

你的原代码里,只需要把链式调用的identified(by: \.id)换成ForEach初始化器的第二个参数id: \.id就可以了,修改后的完整代码如下:

@State private var showTargets = [ (id: 1, state: false, x: 109.28, y: 109.28), (id: 2, state: false, x: 683, y: 109.28), (id: 3, state: false, x: 1256.72, y: 109.28) ] 

var body: some View { 
    HStack { 
        // 这里是修改后的ForEach写法
        ForEach(showTargets, id: \.id) { item in 
            Text(String(item.x)) 
        } 
    }
}

关键变化说明

  • 原来的ForEach(数据源.identified(by: 标识路径))变成了ForEach(数据源, id: 标识路径),把数据源和唯一标识的KeyPath拆分成了两个独立参数。
  • 因为你的数组元素是自带id属性的元组,所以用\.id来指定唯一标识是完全适配的,SwiftUI会通过这个id来跟踪列表元素的变化。

更规范的进阶写法(可选)

如果想让代码更符合SwiftUI的最佳实践,建议把元组改成遵循Identifiable协议的结构体,这样连id:参数都可以省略:

// 定义遵循Identifiable的结构体
struct Target: Identifiable {
    let id: Int
    var state: Bool
    var x: Double
    var y: Double
}

// 初始化数据源
@State private var showTargets = [
    Target(id: 1, state: false, x: 109.28, y: 109.28),
    Target(id: 2, state: false, x: 683, y: 109.28),
    Target(id: 3, state: false, x: 1256.72, y: 109.28)
]

var body: some View { 
    HStack { 
        // 无需指定id参数,因为Target遵循了Identifiable
        ForEach(showTargets) { item in 
            Text(String(item.x)) 
        } 
    }
}

这样代码可读性更好,也更符合SwiftUI的设计思路哦。

内容的提问来源于stack exchange,提问作者krjw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:09:39