Что означает [[Element] .Element] в перегрузке оператора Swift ==? - PullRequest
0 голосов
/ 08 ноября 2018

Тип массива Swift реализует протокол 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] - это определение типа, то есть массив типов, обозначенный Element (Element - имя типа заполнителя).
  2. Исходя из 1, далее я считаю, что крайние скобки обозначают другой массив, НО ...
  3. Я не могу понять, что означает [Element].Element, так как .Element озадачивает меня.

1 Ответ

0 голосов
/ 08 ноября 2018

Как правило, 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]

который должен быть таким же, но не принимается компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...