- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用新的 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
时,它必须返回可以被识别的东西。因此,您应该返回该案例特有的内容。对于 String
基 enum
,rawValue
是您拥有的最佳选择:
extension MyEnum: Identifiable {
var id: RawValue { rawValue }
}
此外,enum
通常可以自行识别:
extension MyEnum: Identifiable {
var id: Self { self }
}
⚠️注意1:如果您返回不稳定的内容,例如UUID()或索引,这意味着您会得到一个新的每次获取对象时都会对象,这将破坏可重用性,并且除了诸如转换管理等 View 管理问题之外,还可能导致大量内存和布局进程使用。
注释 2:从 Swift 5.1 开始,单行闭包不需要 return
关键字。
注解 3:尽量不要为您自己的类型使用全局已知的名称,例如 Data
。至少使用命名空间,例如 MyCustomNameSpace.Data
您可以通过其元素的键路径之一使任何集合可内联迭代:
例如 self
:
List(MyEnum.allCases, id:\.self)
或任何其他兼容的键路径:
List(MyEnum.allCases, id:\.rawValue)
<小时/>
关于ios - 如何使枚举符合 Swift 中的可识别协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57409804/
我是一名优秀的程序员,十分优秀!