我创建了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
我希望A为[[3, 6, 9], [12, 15, 18]]
,B为[[[5, 10], [15, 20]], [[25, 30], [35, 40]]]
。如何在不显式定义*
,Element * Array<Array<Element>>
等的情况下使Element * Array<Array<Array<Element>>>
运算符像这样(递归)工作?