如何在Swift中确认可识别协议的枚举?

时间:2019-08-08 09:50:20

标签: ios enums swiftui swift5.1

我正在尝试使用新的 SwiftUI 框架通过枚举列出案例原始值。但是,我在使“数据”符合可识别协议方面遇到了麻烦,而且我真的找不到信息。它告诉我“ Initializer'init(_:rowContent :)'要求'Data'必须符合'Identifiable'”。存根在最后一个扩展中为我提供了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)
        }
    }
}

3 个答案:

答案 0 :(得分:12)

当某些内容符合Identifiable时,它必须返回可以被该内容识别的内容。因此,您应该返回该情况下唯一的东西。对于以String为基础的enumrawValue是您的最佳选择:

extension Data: Identifiable {
    var id: String { rawValue }
}

通常,枚举也可以通过自身来识别:

extension Data: Identifiable {
    var id: Data { self }
}

注意1 :如果您返回始终唯一的内容(例如 UUID ),则意味着每次获取对象时都会获得一个新对象,这将破坏可重用性并可能导致史诗般的内存和布局流程使用情况。

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

注释3 :请勿对自己的类型使用全球知名的名称,例如Data。至少使用名称空间,例如MyCustomNameSpace.Data

串联模式

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

例如self

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

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

List (Data.allCases, id:\.rawValue)

答案 1 :(得分:1)

你可以试试这个:

enum MyEnum: Identifiable {
    case valu1, valu2
    
    var id: Int {
        get {
            hashValue
        }
    }
}

答案 2 :(得分:-1)

完成!答案是这样:

extension Data: Identifiable {
    var id: UUID {
        return UUID()
    }
}