是否可以在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 }
}