我想对一些代码进行单元测试,这些代码使用[T?]
形式的类型(可选项数组)创建值。但是==
没有为选项数组定义:
Binary Operator '==' cannot be applied to two '[String?]' operands
所以我相应地扩展Array
(this answer之后):
extension Array {
static func ==<T: Equatable>(lhs: [T?], rhs: [T?]) -> Bool {
if lhs.count != rhs.count {
return false
}
else {
return zip(lhs,rhs).reduce(true) { $0 && ($1.0 == $1.1) }
}
}
}
但现在我明白了:
Ambiguous reference to member '=='
结合起来,这些信息似乎没有意义;我如何从零拟合方法/函数转到多个?
如何扩展Array
以检查可选项数组的相等性?
答案 0 :(得分:2)
如果您想将其保留为Array的扩展名:
extension Array where Element : Equatable {
static func ==(lhs: [Element?], rhs: [Element?]) -> Bool {
if lhs.count != rhs.count {
return false
}
else {
for i in 0..<lhs.count {
if lhs[i] != rhs[i] { return false }
}
return true
}
}
}
let a: [String?] = ["John", nil]
let b: [String?] = ["John", nil]
let c: [String?] = ["Jack", nil]
print(a == b) // true
print(a == c) // false
这里的for
循环效率更高有两个原因:(a)你不必像zip
一样构造一个临时的元组数组,(b)它返回{{ 1}}一旦找到不匹配。