【发布时间】:2018-04-05 08:17:27
【问题描述】:
注意:我认为人们忽略了这个问题的重点,这不是关于我有一个元素是协议的数组,甚至可能不是关于有条件地符合 Equatable 的具体内容;这些只是我正在使用的示例。问题在于,似乎不可能多次(在不同的条件下)有条件地使某些东西符合协议。
当 Swift 4.1 宣布符合条件时,我期待数组和字典在其元素符合 Equatable 时符合。此外,我有一些自定义协议数组(称为AnyDataType),它定义了自己的比较函数,以允许在任意两个AnyDataType 变量之间进行比较,即使它们属于不同的具体类型:
protocol AnyDataType {
func isEqual(to otherDataType: AnyDataType) -> Bool
}
我希望我可以通过添加额外的一致性使 Array<AnyDataType> 符合 Equatable:
extension Array: Equatable where Element == AnyDataType {
static func == (lhs: [AnyDataType], rhs: [AnyDataType]) -> Bool {
...
}
}
不幸的是,它不起作用。当它编译时,我收到以下警告:
“Array”与协议“Equatable”的一致性已经在类型的模块“Swift”中说明
它实际上并没有使Array<AnyDataType> 符合Equatable 反正(例如,你不能比较两个[[AnyDataType]]s)。我需要做些什么不同的事情,还是这不可能?
请注意,这与它是一组协议无关。我在尝试符合一组自定义的非Equatable 结构时也遇到了同样的问题。
【问题讨论】:
-
我不能将
AnyDataType与Equatable一致,因为它不允许比较 any 两个AnyDataTypes(即,您必须知道具体类型)。 -
这个问题与我使用协议数组的事实无关,请参阅底部的注释。我遇到的问题可能是因为 Swift 似乎不允许多个条件符合同一协议。