首页 > 解决方案 > 将数据传递给列表

问题描述

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

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

在此处输入图像描述

标签: iosswiftui

解决方案


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

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


推荐阅读