协议符合具有关联值的类型

Protocol conforming to type with associated value

我有以下片段:

protocol MyProtocol: Identifiable where ID == UUID {
    var id: UUID { get }
}


var test: [MyProtocol] = []

Protocol 'MyProtocol' can only be used as a generic constraint because it has Self or associated type requirements

为什么这不起作用? where ID == UUID 不应该消除错误所涉及的歧义吗?我在这里遗漏了什么吗?

我认为这个问题与这个问题类似:Usage of protocols as array types and function parameters in swift

但是,我本以为添加 where ID == UUID 应该可以解决问题?为什么不是这样?

谢谢!

编辑

因此,在试验 SwiftUI 和结构数据模型时出现了这个问题。我一直将 类 用于任何类型的数据模型,但似乎 SwiftUI 想让你尽可能多地使用结构(我仍然不明白这在现实中是如何实现的,但这就是为什么我正在试验它)。

在这种特殊情况下,我尝试拥有一个包含全部符合 MyProtocol 的结构的管理器。例如:

protocol MyProtocol: Identifiable where ID == UUID {
    var id: UUID { get }
}

struct A: MyProtocol { // First data model
    var id: UUID = UUID()
}

struct B: MyProtocol { // Second data model
    var id: UUID = UUID()
}

class DataManager: ObservableObject {
    var myData: [MyProtocol]
}

...

我实际上不必在 MyProtocol 上声明 Identifiable,但我认为它会更好、更干净。

因为这不是 Swift 的当前功能。一旦有关联类型,就总是有关联类型。它不会因为你限制它而消失。一旦它有一个关联类型,它就不是具体的。

无法通过这种方式 "inherit" 协议。你的意思是:

protocol MyProtocol {
    var id: UUID { get }
}

然后您可以将 Identifiable 附加到需要它的结构中:

struct X: MyProtocol, Identifiable {
    var id: UUID
}

(注意不需要 where 子句。)

今天没有 Swift 功能允许你说 "types that conform to X implicitly conform to Y." 今天也没有 Swift 功能允许 "things that conform to Identifiable with ID==UUID." 的数组(这叫做广义的存在主义,目前不可用。)

您很可能应该返回到您的调用代码并探索您为什么需要这个。如果您 post 迭代 test 的代码并且特别需要 Identifiable 一致性,那么我们可以帮助您找到不需要那个的设计。