On XCode 11 beta 4 the following seems to be deprecated and I don't know how to rewrite this. Does anybody know how to use 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)
]
...
var body: some View {
HStack {
ForEach(showTargets.identified(by: \.id)) { item in
Text(String(item.x))
}
}
The id: \. self part is required so that SwiftUI can identify each element in the array uniquely – it means that if you add or remove an item, SwiftUI knows exactly which one. You can use this approach to create loops of any type.
Calls the given closure on each element in the sequence in the same order as a for - in loop.
id: . self tells Swift to use as unique id (keypath) the hash of the object. It explains why the name "self" is used. id: . self is especially useful for the basic Swift types like Integer and String.
(Still working with Xcode 11.0 / Swift 5.1)
I haven't downloaded Xcode Beta 4 yet, but according to the documentation, it should be something like:
ForEach(showTargets, id: \.id) { item in
Text(String(item.x))
}
You can also use a struct
that conforms to Identifiable
(note that this won't work on tuple because you can't add protocol conformance):
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))
}
Adding example for list
List(showTargets, id: \.id) { item in
ItemRow(item: item)
}
when showTargets conforms to identifiable protocol:
List(showTargets) { item in
ItemRow(item: item)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With