Можно ли назначить typealias для двумерного массива в Swift? typealias MatrixT <T>= [[T]] - PullRequest
0 голосов
/ 19 октября 2019

Я хотел бы назначить typealias для 2D универсального массива. ( Я не хочу создавать новый тип struct MatrixT<T>{}). Поэтому я делаю следующее:

typealias MatrixT<T> = [[T]]

Но когда я начал писать расширение для него, я обнаружил, что компилятор на самом деле не понимает, что MatrixT это 2D массив. Он распознает тип self как [Element]

extension MatrixT {
    var columnsCount: Int {
        let copy = self \\compilator recognizes this as let copy: [Element] = self
        let row = self[0] \\compilator recognizes this as  let row: Element
        return 0
    }
}

Но вне расширения компилятор Swift понимает, что элемент MatrixT является массивом.

func testCreation() {
    let matrix: MatrixT = [[0]]
    let firstRow:[Int] = matrix[0] \\ correct
    let columnsCount = firstRow.count
}

Почему я могуНе относится ли тип MatrixT в расширении к массиву 2D ([[T]])?

1 Ответ

0 голосов
/ 01 ноября 2019

typealias - это псевдоним для существующего типа. Здесь это относится к массиву чего-либо. Если вы посмотрите на определение Массива, то

public struct Array<Element> 

означает, что Элемент является массивом. Расширяя ваше, для следующего определения

typealias MatrixZ<Z> = [[[Z]]]

extension MatrixZ {

    var someCount: Int {
        let copy = self
        let row = self[0]
        return 0
    }
}

здесь также оказывается Элемент, который является двумерным массивом.

...