我正在Swift中构建一个非常简单的结构,其中包含一个可选值数组。这个结构必须符合平等的协议。这是代码:
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)
发布于 2014-08-09 21:07:05
它不能工作的原因是没有为具有可选元素的数组定义==运算符,只为非可选元素定义:
/// 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
}发布于 2016-01-28 07:13:28
另一个有用的选项是使用在elementsEqual:isEquivalent:上可用的SequenceType方法。这可以让您避免实现Equatable,但最好是很少使用,因为它更冗长。
用法:
let a: [Int?] = []
let b: [Int?] = []
if a.elementsEqual(b, isEquivalent: { $0 == $1 }) {
print("foo") // Works
}https://stackoverflow.com/questions/25219416
复制相似问题