将数据传递到列表

时间:2019-07-16 07:50:39

标签: ios swiftui

此代码可能是什么问题?

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

enter image description here

2 个答案:

答案 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

}