krjw
krjw

Reputation: 4450

SwiftUI ForEach 'identified(by:)' is deprecated. Use ForEach(_:id:) or List(_:id:)

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))

        }
}

Upvotes: 10

Views: 10792

Answers (3)

nikhil nangia
nikhil nangia

Reputation: 581

If your list objects conform to the identifiable protocol & do have id (uniquely defined) variable inside along with other properties of an object.

You can simply iterate over the list by not passing the id: parameters.

List(showTargets) { item in
 Text(String(item.x))
}

Otherwise, You can simply iterate using ForEach:

List(showTargets, id: \.id) { item in
 Text(String(item.x))
}

Checkout Few Reference Doc: Identifiable Documentation

Upvotes: 0

rraphael
rraphael

Reputation: 11066

(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))
}

Upvotes: 23

patilh
patilh

Reputation: 73

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)
 }

Upvotes: 2

Related Questions