协议符合具有关联值的类型
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
一致性,那么我们可以帮助您找到不需要那个的设计。
我有以下片段:
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
一致性,那么我们可以帮助您找到不需要那个的设计。