将数据传递给列表
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_
}
}
无论如何,请确保您用来标识元素的 属性 确实是独一无二的。否则,您的列表可能会产生奇怪的结果。
这段代码可能有什么问题?
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_
}
}
无论如何,请确保您用来标识元素的 属性 确实是独一无二的。否则,您的列表可能会产生奇怪的结果。