我在Swift中构建一个非常简单的结构,其中包含一组可选值。此结构必须符合Equatable协议。这是代码:
struct MyTable: Equatable {
var values: [Int?] = Array(count: 64, repeatedValue: nil)
}
func == (lhs: MyTable, rhs: MyTable) -> Bool {
return lhs.values == rhs.values
}
非常简单。我没有看到错误,但编译器给出了错误:“'[Int?]'不能转换为'MyTable'”。我做了些蠢事吗?或者这是编译器的错误?谢谢!
(使用Xcode6-Beta5)
答案 0 :(得分:7)
它不起作用的原因是没有为具有可选元素的数组定义==
运算符,仅用于非可选元素:
/// Returns true if these arrays contain the same elements.
func ==<T : Equatable>(lhs: [T], rhs: [T]) -> Bool
您可以提供自己的:
func ==<T : Equatable>(lhs: [T?], rhs: [T?]) -> Bool {
if lhs.count != rhs.count {
return false
}
for index in 0..<lhs.count {
if lhs[index] != rhs[index] {
return false
}
}
return true
}
答案 1 :(得分:0)
另一个有用的选项是使用elementsEqual:isEquivalent:
上提供的SequenceType
方法。这可以让您避免实现Equatable
,但最好少用,因为它更详细。
用法:
let a: [Int?] = []
let b: [Int?] = []
if a.elementsEqual(b, isEquivalent: { $0 == $1 }) {
print("foo") // Works
}