Как правило, 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]
который должен быть таким же, но не принимается компилятором.