Я создал расширение класса 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>>>
и т. Д .?