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
相关产品推荐
相关产品推荐

