Поскольку умножение является коммутативным, нет смысла определять тип вывода *
как один из типов операндов. Вместо этого вы можете разрешить инициализацию всех DArray
с их элементами.
protocol DArray: Sequence where Element: Numeric {
var elements: [Element] { get set }
init<Elements: Sequence>(_: Elements) where Elements.Element == Element
}
extension Vector {
init<Elements: Sequence>(_ elements: Elements) where Elements.Element == Element {
self.init( Array(elements) )
}
}
И затем определить оператор следующим образом:
extension DArray {
static func * <Parameter1: DArray, Output: DArray>(
dArray0: Self, dArray1: Parameter1
) -> Output
where Parameter1.Element == Element, Output.Element == Element {
multiply(dArray0, dArray1)
}
static func * (dArray0: Self, dArray1: Self) -> Self {
multiply(dArray0, dArray1)
}
private static func multiply<Parameter0: DArray, Parameter1: DArray, Output: DArray>(
_ dArray0: Parameter0, _ dArray1: Parameter1
) -> Output
where Parameter0.Element == Parameter1.Element, Parameter1.Element == Output.Element {
.init( zip(dArray0, dArray1).map(*) )
}
}
Таким образом, вы можете явным образом введите результат, как вам угодно, и получите перегрузку для случая, когда имеет смысл использовать неявную типизацию.
struct ?: DArray, IteratorProtocol {
mutating func next() -> Int? { nil }
var elements: [Element] = []
init<Elements: Sequence>(_ elements: Elements) where Elements.Element == Element { }
}
( Vector() * ?([]) ) as Vector
( Vector() * ?([]) ) as ?
( ?([]) * Vector() ) as Vector
( ?([]) * Vector() ) as ?
let vector: Vector = ( Vector() * ?([]) )
let ?: ? = ( ?([]) * Vector() )
Vector([1]) * Vector()