不建议使用SwiftUI ForEach'identified(by :)'。使用ForEach(_:id :)或List(_:id :)

krj*_*rjw 8 swiftui

在XCode 11 beta 4上,以下内容似乎已被弃用,我不知道该如何重写。有人知道怎么用ForEach(_: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)
]
Run Code Online (Sandbox Code Playgroud)

...

var body: some View {
    HStack {

        ForEach(showTargets.identified(by: \.id)) { item in
            Text(String(item.x))

        }
}
Run Code Online (Sandbox Code Playgroud)

rra*_*ael 15

(仍可使用Xcode 11.0 / Swift 5.1)

我尚未下载Xcode Beta 4,但是根据文档,它应该类似于:

ForEach(showTargets, id: \.id) { item in
    Text(String(item.x))
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用struct符合的Identifiable(请注意,这不适用于元组,因为您无法添加协议符合性):

struct Targets: Identifiable {
    var id: Int
    var state: Bool
    var x: Double
    var y: Double
}

let showTargets = [
    Targets(id: 1, state: false, x: 109.28, y: 109.28),
    Targets(id: 2, state: false, x: 683, y: 109.28),
    Targets(id: 3, state: false, x: 1256.72, y: 109.28)
]

ForEach(showTargets) { item in
    Text(String(item.x))
}
Run Code Online (Sandbox Code Playgroud)

  • 由于某种原因,当我尝试将 ForEach 内的文本更改为更复杂的视图时,我得到类型“_”没有成员“id”。你知道为什么吗? (2认同)