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
}
我有三个问题:
[[Element].Element]
? 到目前为止,我的推理是:
[Element]
是类型定义,即由
Element
(Element
是一个占位符类型名称)。 [Element].Element
的含义,因为.Element
在困扰我。答案 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]
应应相同,但编译器不接受。