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

是否可以在Swift中使用自定义运算符定义[Int]*Int?,swift,operator-overloading,operators,Swift,Operator Overloading,Operators,我想定义一个新的运算符,将数组的每个元素[Int]乘以Int,例如[3,2,10]*10 但是,由于Int既不是协议也不是类(它是结构),我首先定义了以下内容: protocol Numeric {} extension Int: Numeric {} extension Double: Numeric {} extension Float: Numeric {} 然后,我尝试定义运算符,如: func *<T: Numeric> (left: [T], right: T) -&g

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

但是,由于
Int
既不是协议也不是类(它是结构),我首先定义了以下内容:

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
}
func *<T: Numeric> (left: T, right: T) -> T {
    return left * right
}
然而,尽管编译过程中没有出现问题,但运行时错误是由大量的
static*infix引起的

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


因此,仍然可以在Swift中定义
[Int]*Int
运算符吗?

您必须在
数值中要求乘法运算
协议:

protocol Numeric {
    func *(lhs: Self, rhs: Self) -> Self
}
否则,
newArray.append(i*right)
中的乘法是 没有定义

你的

func*(左:T,右:T)->T{
向左*向右返回
}
(递归调用自身,导致堆栈溢出)则不需要

新操作符本身的实现可以简化 (如已删除的答案中所述)对

func*(左[T],右:T)->[T]{
返回left.map{$0*right}
}

ooh太棒了。我第一次尝试用map来定义它,但是在我碰到墙之后,我使它变得更简单,以确保问题不是来自
map
。非常感谢。
func *<T: Numeric> (left: T, right: T) -> T {
    return left * right
}
func *<T: Numeric> (left: [T], right: T) -> [T] {
    return left.map { $0 * right }
}