繁体   English   中英

SwiftUI Initialzier 要求 String 符合 Identifiable

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM