SwiftUI初始化器要求字符串符合可识别

ebdffaop  于 2023-03-16  发布在  Swift
关注(0)|答案(4)|浏览(160)

这是我第一次尝试编写SwiftUI代码,在尝试创建一个简单的表视图时遇到了一个问题。在此代码中,teamsString的数组,但List给我带来了以下错误:
初始值设定项“init(_:rowContent:)”要求“String”符合“Identifiable”

var body: some View {
    let teams = getTeams()
    Text("Hello there")
    List(teams) { team in
        
    }
}

有人知道这是什么意思吗?

dxpyg8gm

dxpyg8gm1#

List的参数必须是唯一的,这就是Identifiable协议的目的
你能做到

List(teams, id: \.self) { team in

但是你有责任确保这些字符串是唯一的。2如果不是这样,你将得到意想不到的行为。
更好的方法是使用具有唯一id的定制结构,该结构符合Identifiable

gpfsuwkq

gpfsuwkq2#

Apple首选的方法是添加String扩展名:

extension String: Identifiable {
    public typealias ID = Int
    public var id: Int {
        return hash
    }
}

请参阅以下代码示例以供参考:https://github.com/apple/cloudkit-sample-queries/blob/main/Queries/ContentView.swift

6pp0gazn

6pp0gazn3#

我假设getTeams()返回一个[String](也就是Array<String>)。
正如错误所暗示的,问题在于字符串是不可识别的,但不仅仅是“它们不符合Identifiable协议”的意义,而是更广泛的意义:如果两个字符串是"foo",则一个字符串与另一个字符串是不可区分的;它们是一样的。
这对于List视图来说是不可接受的。假设您有一个包含"foo"条目的列表,用户拖动并重新排列其中的一个条目,List如何区分它们,以确定两个条目中的哪一个应该移动?
要解决这个问题,您需要使用另一个标识源,以允许List区分它的所有条目。
你应该看看"Demystify SwiftUI" talk from this year's WWDC,它详细介绍了这个主题。

qni6mghb

qni6mghb4#

如果您尝试查看类型为“Struct”的项的“List”,请将Struct更改为使用“Identifiable”:
我的结构:

struct Post : Identifiable{
    let id = UUID()
    let title: String
}

我的列表:

let posts = [
    Post( title: "hellow"),
    Post( title: "I am"),
    Post( title: "doing"),
    Post( title: "nothing")
]

然后您可以查看您的列表:

List(posts){post in
   Text(post.title
}

相关问题