Как я могу определить рекурсивный элемент умножением массива? - PullRequest
0 голосов
/ 25 февраля 2019

Я создал расширение класса Array, которое позволяет умножать два массива, если их элементы умножаются.Также это позволяет умножить элемент на массив этих элементов.

protocol Multiplicable {
    static func * (lhs: Self, rhs: Self) -> Self
}

extension Array: Multiplicable where Element: Multiplicable {
    static func * (lhs: Array, rhs: Array) -> Array {
        return zip(lhs, rhs).map { $0 * $1 }
    }

    static func * (lhs: Element, rhs: Array) -> Array {
        return rhs.map { lhs * $0 }
    }

    static func * (lhs: Array, rhs: Element) -> Array {
        return rhs * lhs
    }
}

Однако, если массив содержит массивы «что-то», он все равно должен быть умножен на «что-то».

extension Int: Multiplicable {}

let V = [[1, 2, 3], [4, 5, 6]]
let A = 3 * V

let W = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
let B = 5 * W

Я бы хотел, чтобы А было [[3, 6, 9], [12, 15, 18]], а В - [[[5, 10], [15, 20]], [[25, 30], [35, 40]]].Как я могу заставить оператор * работать так (рекурсивно) без явного определения, что такое Element * Array<Array<Element>>, Element * Array<Array<Array<Element>>> и т. Д .?

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