是否可以在 Swift 中使用自定义运算符定义 [Int] * Int?

Is it possible to define [Int] * Int using custom operator in Swift?

我想定义一个新的运算符,将数组[Int]的每个元素乘以Int,比如[3, 2, 10] * 10.

然而,因为Int既不是协议也不是class(它是结构体),我首先定义如下:

protocol Numeric {}
extension Int: Numeric {}
extension Double: Numeric {}
extension Float: Numeric {}

然后,我尝试定义运算符,例如:

func *<T: Numeric> (left: [T], right: T) -> [T] {
    var newArray: [T] = []
    for i in left {
        newArray.append(i * right)
    }

    return newArray
}

但是,这会报错:Cannot convert value of type 'T' to expected argument type '[_]'

我不确定 [_] 类型是什么意思,我 不希望 ,但我想问题出在我没有定义的运算符采用 TT,在本例中两者都是 Numeric

所以我定义了另一个运算符,比如:

func *<T: Numeric> (left: T, right: T) -> T {
    return left * right
}

然而,虽然编译没有问题,但运行时错误发生了很多static * infix <A where ...> (A, A) -> A

我不确定为什么这个运算符被执行了这么多次,但现在我想知道是否可以首先定义一个自定义的 * 运算符,尽管 Int 可以已经定义了 * 运算符。

那么在Swift中是否仍然可以定义[Int] * Int运算符?

你必须要求Numeric中的乘法运算 协议:

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

否则newArray.append(i * right)中的乘法是 未定义。

你的

func *<T: Numeric> (left: T, right: T) -> T {
    return left * right
}

(递归调用自身,导致堆栈溢出)就不需要了。

可以简化新运算符本身的实现 (如现已删除的答案中所述)至

func *<T: Numeric> (left: [T], right: T) -> [T] {
    return left.map { [=12=] * right }
}