类型'[String]'不符合协议'Equatable'
问题描述:
我想使用[String]作为通用参数。类型'[String]'不符合协议'Equatable'
public class Cell<T : Equatable> {}
这里是一个线,我得到一个错误:
class TagsCell : Cell<[String]>, CellType {
}
我已经添加了这些代码,但它并不能帮助
public func == (lhs: [String], rhs: [String]) -> Bool {
return lhs.count == rhs.count && (zip(lhs, rhs).contains { $0.0 != $0.1 }) == false
}
答
阵列不符合Swift中的Equatable
。符合Equatable
意味着存在这种类型的==
运算符,但不是反之。因此,即使您为[String]
类型实施==
,也无法使用Cell<[String]>
。
在你的情况,我建议采用以下方案:
public class Cell<T : SequenceType where T.Generator.Element: Equatable> {}
class TagsCell : Cell<[String]> {
}
使用包装出来的[String]
:
public class Cell<T : Equatable> {}
struct StringArray: Equatable {
var value: [String]
}
class TagsCell : Cell<StringArray> {
}
func ==(lhs: StringArray, rhs: StringArray) -> Bool {
return lhs.value == rhs.value
}
+0
改变Cell类的来源并不好,因为它来自外部库。有什么解决方案可以使Swift数组为Equatable? –
+0
@SemyonTikhonenko据我所知,没有办法使Array“Equatable”有意义。你有可能使用'[String]'中的包装吗? –
这不是重复。我已经尝试了另一个问题的答案,并添加了一些代码来比较数组,并且它并没有帮助case [String]仍然不符合Equatable协议 –
请在出现错误的位置添加代码块(并指出该行你在哪里得到它)。 – courteouselk
刚刚添加了行 –