最后一条语句为什么失败与错误编译:Binary operator '==' cannot be applied to two '[[Simple]]’ operands,而且是有办法的方式来修改一个Simple结构或延长==运营商能够在嵌套阵列(或字典)进行平等检查?
var i1: [Int] = [1]
var i2: [Int] = [1]
i1 == i2 // -> true
var i3: [[Int]] = [[1], [2]]
var i4: [[Int]] = [[1], [2]]
i3 == i4 // -> true
struct Simple: Equatable, Hashable {
    let message: String
    var hashValue: Int {
        return message.hashValue
    }
}
func ==(lhs: Simple, rhs: Simple) -> Bool {
    return lhs.message == rhs.message
}
var a: [Simple] = [Simple(message: "a")]
var b: [Simple] = [Simple(message: "a")]
a == b // -> true
var x: [[Simple]] = [[Simple(message: "a")], [Simple(message: "b")]]
var y: [[Simple]] = [[Simple(message: "a")], [Simple(message: "b")]]
x == y // -> ERROR! Binary operator '==' cannot be applied to two '[[Simple]]’ operands
Mar*_*n R 14
更新:Swift 4.1中已实现条件一致性.特别是:
标准库类型Optional,Array和Dictionary现在符合Equatable协议,当它们的元素类型符合Equatable时....
(来自Swift CHANGELOG).
任意嵌套的Equatable元素数组Equatable现在都可以与之进行比较==.你的代码
var x: [[Simple]] = [[Simple(message: "a")], [Simple(message: "b")]]
var y: [[Simple]] = [[Simple(message: "a")], [Simple(message: "b")]]
x == y
如果Simple是,则在Xcode 9.3中编译Equatable.
(旧答案:) 
原因类似于为什么Equatable没有为可选数组定义.阵列可比较与==如果元素类型是Equatable:
/// Returns true if these arrays contain the same elements.
public func ==<Element : Equatable>(lhs: [Element], rhs: [Element]) -> Bool
这就是为什么
var a: [Simple] = [Simple(message: "a")]
var b: [Simple] = [Simple(message: "a")]
a == b // -> true
编译.
但即使是equatable类型T,Array<T> 不符合该Equatable协议,比较为什么我不能做阵列符合Equatable?.因此,在
var x: [[Simple]] = [[Simple(message: "a")], [Simple(message: "b")]]
var y: [[Simple]] = [[Simple(message: "a")], [Simple(message: "b")]]
x == y // -> ERROR! Binary operator '==' cannot be applied to two '[[Simple]]’ operands
x和y与元素类型阵列[Simple],其不会
 不符合Equatable协议,并且不存在匹配的==运算符.
您可以==为简单嵌套数组定义泛型运算符
func ==<Element : Equatable> (lhs: [[Element]], rhs: [[Element]]) -> Bool {
    return lhs.count == rhs.count && !zip(lhs, rhs).contains {$0 != $1 }
}
或更简单(如@kennytm所建议的):
func ==<Element : Equatable> (lhs: [[Element]], rhs: [[Element]]) -> Bool {
    return lhs.elementsEqual(rhs, by: ==)
}
这使x == y编译和工作按预期进行.目前,似乎没有办法==在任意嵌套的数组上定义运算符.