[英]SwiftUI Initialzier requires String conform to Identifiable
我第一次尝试编写一些 SwiftUI 代码,并且在尝试制作简单的表格视图时遇到了问题。 在此代码中, teams
是一个String
数组,但List
给了我以下错误: Initializer 'init(_:rowContent:)' requires that 'String' conform to 'Identifiable'
var body: some View {
let teams = getTeams()
Text("Hello there")
List(teams) { team in
}
}
有人知道这意味着什么吗?
List
的参数必须是唯一的,这就是Identifiable
协议的目的
你可以做
List(teams, id: \.self) { team in
但是你有责任确保字符串是唯一的。 如果不是,你会得到意想不到的行为。
更好的是使用具有符合Identifiable
的唯一id
的自定义结构
我假设getTeams()
返回一个[String]
(又名Array<String>
)。
正如错误所暗示的那样,问题在于字符串无法识别。 但不仅仅是在“它们不符合Identifiable
协议”的意义上,而是在更广泛的意义上:如果两个字符串是"foo"
,则一个与另一个无法区分; 它们是相同的。
这对于List
视图是不可接受的。 想象一下,您有一个包含"foo"
条目的列表,并且用户拖动以重新排列其中一个。 List
如何区分它们,知道两者中的哪一个应该移动?
为了解决这个问题,您需要使用另一个身份来源来允许List
区分其所有条目。
您应该观看今年 WWDC 上的“Demystify SwiftUI”演讲。 它详细介绍了这个主题。
Apple 首选的方法是添加一个字符串扩展:
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
如果您尝试 go 在“结构”类型的项目的“列表”上更改结构以使用“可识别”:
我的结构:
struct Post : Identifiable{
let id = UUID()
let title: String
}
我的列表:
let posts = [
Post( title: "hellow"),
Post( title: "I am"),
Post( title: "doing"),
Post( title: "nothing")
]
那么你可以在你的列表中使用 go :
List(posts){post in
Text(post.title
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.