将数据传递给列表

Passing Data to List

这段代码可能有什么问题?

import SwiftUI

struct ContentView : View {
let usersData = [User.init(name_: "shauket", profession_: "Software Engineer", age_: 30), User.init(name_: "Adil", profession_: "Software Engineer", age_: 24), User.init(name_: "Arslan", profession_: "Software Engineer", age_: 28), User.init(name_: "Ahmed", profession_: "Software Engineer", age_: 30), ]

var body: some View {
    List(usersData) { user in
        // here i can not access user
    }
  }
}

struct User {
var name: String
var profession: String
var age: Float
init(name_: String, profession_: String, age_: Float ) {
    self.name = name_
    self.profession = profession_
    self.age = age_
}
}

因此根据 SwiftUI Tutorials : Make the List Dynamic / Documentation,您应该在 User 结构中实现协议 Hashable, Codable, Identifiable

Step 3

Switch to Landmark.swift and declare conformance to the Identifiable protocol.

Since the Landmark type already has the id property required by Identifiable->protocol, there’s no more work to do.

步骤 1

List(usersData.identified(by: \.name_)) { user in

}

usersData 应该是一个可识别的数组。即,包含符合 Identifiable 协议的元素的数组。对于符合 Identifiable 的类型,你基本上需要有一个 属性 命名的 id.

或者,如果您有另一个 属性 可以唯一标识您的元素,您可以将它与 identified(by:) 方法 (beta 3) 或 List(_:id:) (beta 4).在你的情况下,如果我们使用名称作为唯一标识符,你可以这样做:

注意:截至目前,Xcode beta 4 尚未发布。但 Catalina beta 4 的发行说明表明 .identified(by:) 将被 List(_:id:) 弃用。我包括了大概的语法,但我现在无法测试。

        // Beta 3 syntax
        List(usersData.identified(by: \.name)) { user in
            Text(user.name)
        }

        // Beta 4 syntax
        List(usersData, id: \.name) { user in
            Text(user.name)
        }

如果您无法生成可识别数组,您可以通过索引访问它:

        List(0..<usersData.count) { i in
            Text(self.usersData[i].name)
        }

如果您希望让您的 User 可识别,您可以这样做:

struct ContentView : View {
    let usersData = [User.init(id: 0, name_: "shauket", profession_: "Software Engineer", age_: 30), User.init(id: 1, name_: "Adil", profession_: "Software Engineer", age_: 24), User.init(id: 2, name_: "Arslan", profession_: "Software Engineer", age_: 28), User.init(id: 3, name_: "Ahmed", profession_: "Software Engineer", age_: 30), ]

    var body: some View {
        List(usersData) { user in
            Text(user.name)
        }
    }
}

struct User: Identifiable {
    var id: Int
    var name: String
    var profession: String
    var age: Float
    init(id: Int, name_: String, profession_: String, age_: Float ) {
        self.id = id
        self.name = name_
        self.profession = profession_
        self.age = age_
    }
}

无论如何,请确保您用来标识元素的 属性 确实是独一无二的。否则,您的列表可能会产生奇怪的结果。