gpt4 book ai didi

ios - 如何使枚举符合 Swift 中的可识别协议(protocol)?

转载 作者:行者123 更新时间:2023-12-02 03:27:31 25 4
gpt4 key购买 nike

我正在尝试使用新的 SwiftUI 框架通过枚举创建一个包含案例原始值的列表。但是,我在使“数据”符合可识别协议(protocol)方面遇到了麻烦,而且我真的找不到如何做到这一点的信息。它告诉我“初始化程序'init(_:rowContent:)'要求'数据'符合'可识别'” stub 在最后一个扩展中为我提供了一个ObjectIdentifier变量,但不知道我应该返回什么。你能告诉我怎么做吗?如何使数据符合可识别性,以便我可以使用原始值制作列表?

enum Data: String {
case firstCase = "First string"
case secondCase = "Second string"
case thirdCase = "Third string"
}

extension Data: CaseIterable {
static let randomSet = [Data.firstCase, Data.secondCase]
}

extension Data: Identifiable {
var id: ObjectIdentifier {
return //what?
}

}

//-------------------------ContentView------------------------
import SwiftUI

struct Lala: View {
var name: String

var body: some View {
Text(name)
}
}

struct ContentView: View {
var body: some View {
return List(Data.allCases) { i in
Lala(name: i.rawValue)
}
}
}

最佳答案

⚠️ 尽量不要在内部模块中使用已经使用过的名称,例如 Data。我将在这个答案中使用 MyEnum 代替

<小时/>

当某些东西符合Identifying时,它必须返回可以被识别的东西。因此,您应该返回该案例特有的内容。对于 StringenumrawValue 是您拥有的最佳选择:

extension MyEnum: Identifiable {
var id: RawValue { rawValue }
}

此外,enum通常可以自行识别:

extension MyEnum: Identifiable {
var id: Self { self }
}

⚠️注意1:如果您返回不稳定的内容,例如UUID()索引,这意味着您会得到一个新的每次获取对象时都会对象,这将破坏可重用性,并且除了诸如转换管理等 View 管理问题之外,还可能导致大量内存和布局进程使用。

看看这个添加新宠物的奇怪动画: UUID Example

注释 2:从 Swift 5.1 开始,单行闭包不需要 return 关键字。

注解 3:尽量不要为您自己的类型使用全局已知的名称,例如 Data。至少使用命名空间,例如 MyCustomNameSpace.Data

<小时/>

内联模式

您可以通过其元素的键路径之一使任何集合可内联迭代:

例如 self :

List(MyEnum.allCases, id:\.self)

或任何其他兼容的键路径:

List(MyEnum.allCases, id:\.rawValue)
<小时/>

✅ 标识符 list :(来自 WWDC21)

  • 谨慎使用随机标识符。
  • 使用稳定的标识符。
  • 确保唯一性,每项都有一个标识符。

关于ios - 如何使枚举符合 Swift 中的可识别协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57409804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com