是否可以在 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 '[_]'
。
我不确定 [_]
类型是什么意思,我 不希望 ,但我想问题出在我没有定义的运算符采用 T
和 T
,在本例中两者都是 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 }
}
我想定义一个新的运算符,将数组[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 '[_]'
。
我不确定 [_]
类型是什么意思,我 不希望 ,但我想问题出在我没有定义的运算符采用 T
和 T
,在本例中两者都是 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 }
}