如何扩展Array以便可以对选项数组进行等式检查?

时间:2016-12-14 15:12:18

标签: arrays swift types equality xctest

我想对一些代码进行单元测试,这些代码使用[T?]形式的类型(可选项数组)创建值。但是==没有为选项数组定义:

Binary Operator '==' cannot be applied to two '[String?]' operands

所以我相应地扩展Arraythis 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以检查可选项数组的相等性?

1 个答案:

答案 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}}一旦找到不匹配。