注意:我认为人们忽略了这个问题的重点,不是因为我有一个数组,其中元素是一个协议,它可能甚至没有条件符合{{{ 1}}具体;这些只是我使用的例子。问题在于,似乎不可能有条件地将某些内容与协议一致多次(具有不同的条件)。
当Swift 4.1宣布有条件一致性时,我期待阵列和词典符合Equatable
的要素。另外,我有一些自定义协议(称为Equatable
)的数组,它定义了自己的比较函数,以便比较任意两个AnyDataType
变量,即使它们具有不同的具体类型:
AnyDataType
我希望通过添加额外的一致性,protocol AnyDataType {
func isEqual(to otherDataType: AnyDataType) -> Bool
}
符合Array<AnyDataType>
:
Equatable
不幸的是,它不起作用。虽然它确实编译,但我得到以下警告:
&#39;阵列&#39;的符合性协议&#39; Equatable&#39;已经在类型的模块&#39; Swift&#39;
中说明了
实际上,extension Array: Equatable where Element == AnyDataType {
static func == (lhs: [AnyDataType], rhs: [AnyDataType]) -> Bool {
...
}
}
实际上并不符合Array<AnyDataType>
(例如,您无法比较两个Equatable
)。我需要做些什么,或者这是不可能的?
请注意,这与协议数组无关。我在尝试使用一系列自定义非[[AnyDataType]]
结构时遇到了同样的问题。
答案 0 :(得分:1)
根据SE-0143,事实证明这是一个预期的限制,但它可能是未来允许的。
目前,根据所需的用途,最佳解决方案可能是:
Equatable
以便==
起作用,您可以直接在专用集合上实现==
而不符合要求(并为{{添加实现) 1}}只是否定了那个结果)。这对我来说是令人满意的。!=
(因为它是例如协议),请键入erasure might be an option。答案 1 :(得分:-2)
没有办法完成你想要的任务。