[[Element] .Element]在Swift的==运算符重载中是什么意思?

时间:2018-11-08 11:40:47

标签: swift

Swift的Array类型以==和!=运算符重载的方式实现Equatable协议:

extension Array : Equatable where Element : Equatable {

    /// - Parameters:
    ///   - lhs: An array to compare.
    ///   - rhs: Another array to compare.
    public static func == (lhs: [[Element].Element], rhs: [[Element].Element]) -> Bool

    public static func != (lhs: [[Element].Element], rhs: [[Element].Element]) -> Bool
}

我有三个问题:

  1. 什么是[[Element].Element]
  2. 如何阅读?
  3. 为什么我不能在Swift代码中使用该构造?

到目前为止,我的推理是:

  1. [Element]是类型定义,即由 ElementElement是一个占位符类型名称)。
  2. 基于1,接下来我认为最外面的括号表示另一个数组,但...
  3. 我无法弄清[Element].Element的含义,因为.Element在困扰我。

1 个答案:

答案 0 :(得分:2)

通常,TypeA.TypeB可以表示嵌套类型或类型别名TypeB TypeA内,或协议TypeB的关联类型TypeA中。

Array符合Sequence,并且具有associatedtype Element 从其迭代器返回的元素的类型。对于数组 等于数组的元素类型。因此,对于任何类型的T

Array<T>.Element == T

,因此,

[Array<T>.Element] == [T]

示例:

print(type(of: [Array<Int>.Element].self))
// Array<Int>.Type

但是,不接受对内部数组使用括号表示法 通过编译器:

print(type(of: [[Int].Element].self))
// Expected member name or constructor call after type name

现在回到您的问题:==运算符的实际定义是

extension Array : Equatable where Element : Equatable {
    public static func ==(lhs: Array<Element>, rhs: Array<Element>) -> Bool {
        // ...
    }
}

您注意到,“生成的界面”是

extension Array : Equatable where Element : Equatable {
    public static func == (lhs: [[Element].Element], rhs: [[Element].Element]) -> Bool
}

显然,“接口生成器”解释了Element lhs: Array<Element>中的内容不是占位符类型,而是关联的 Element协议的Sequence类型,即操作数的类型 是

Array<Array<Element>.Element>

(如上所示)仅为[Element]。但是然后界面 用括号表示法发出

[[Element].Element]

相同,但编译器不接受。