这是我第一次尝试编写SwiftUI代码,在尝试创建一个简单的表视图时遇到了一个问题。在此代码中,teams
是String
的数组,但List
给我带来了以下错误:
初始值设定项“init(_:rowContent:)”要求“String”符合“Identifiable”
var body: some View {
let teams = getTeams()
Text("Hello there")
List(teams) { team in
}
}
有人知道这是什么意思吗?
4条答案
按热度按时间dxpyg8gm1#
List
的参数必须是唯一的,这就是Identifiable
协议的目的你能做到
但是你有责任确保这些字符串是唯一的。2如果不是这样,你将得到意想不到的行为。
更好的方法是使用具有唯一
id
的定制结构,该结构符合Identifiable
gpfsuwkq2#
Apple首选的方法是添加String扩展名:
请参阅以下代码示例以供参考:https://github.com/apple/cloudkit-sample-queries/blob/main/Queries/ContentView.swift
6pp0gazn3#
我假设
getTeams()
返回一个[String]
(也就是Array<String>
)。正如错误所暗示的,问题在于字符串是不可识别的,但不仅仅是“它们不符合
Identifiable
协议”的意义,而是更广泛的意义:如果两个字符串是"foo"
,则一个字符串与另一个字符串是不可区分的;它们是一样的。这对于
List
视图来说是不可接受的。假设您有一个包含"foo"
条目的列表,用户拖动并重新排列其中的一个条目,List
如何区分它们,以确定两个条目中的哪一个应该移动?要解决这个问题,您需要使用另一个标识源,以允许
List
区分它的所有条目。你应该看看"Demystify SwiftUI" talk from this year's WWDC,它详细介绍了这个主题。
qni6mghb4#
如果您尝试查看类型为“Struct”的项的“List”,请将Struct更改为使用“Identifiable”:
我的结构:
我的列表:
然后您可以查看您的列表: