对于某些非等同类型,将Array符合Equatable

时间:2018-04-05 08:17:27

标签: swift generics

注意:我认为人们忽略了这个问题的重点,不是因为我有一个数组,其中元素是一个协议,它可能甚至没有条件符合{{{ 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]]结构时遇到了同样的问题。

2 个答案:

答案 0 :(得分:1)

根据SE-0143,事实证明这是一个预期的限制,但它可能是未来允许的。

目前,根据所需的用途,最佳解决方案可能是:

  • 如果您希望符合Equatable以便==起作用,您可以直接在专用集合上实现==而不符合要求(并为{{添加实现) 1}}只是否定了那个结果)。这对我来说是令人满意的。
  • 如果您希望您的类型的集合实际上符合类型本身不能的!=(因为它是例如协议),请键入erasure might be an option

答案 1 :(得分:-2)

没有办法完成你想要的任务。