此代码可能是什么问题?
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_
}
}
答案 0 :(得分:3)
usersData应该是可识别的数组。即,包含包含符合可识别协议的元素的数组。要使类型符合Identifiable,基本上需要具有一个名为id的属性。
或者,如果您具有另一个可以唯一标识元素的属性,则可以将其与identified(by :)方法(beta 3)或List(_:id:)(beta 4)一起使用。对于您而言,如果我们使用name作为唯一标识符,则可以执行以下操作:
注意:截至目前,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_
}
}
无论如何,请确保用于标识元素的属性确实是唯一的。否则,您的列表可能会产生奇怪的结果。
答案 1 :(得分:0)
因此,根据SwiftUI Tutorials : Make the List Dynamic / Documentation,您应该在Hashable, Codable, Identifiable
结构中实现协议User
。
第3步
切换到Landmark.swift并声明符合可识别协议。
由于地标类型已经具有Identifiable-> Protocol所需的id属性,因此无需进行其他工作。
第1步
List(usersData.identified(by: \.name_)) { user in
}