gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:36:31 25 4
gpt4 key购买 nike

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

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

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 .

enter image description here

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

那么仍然可以定义[Int] * Int吗? Swift 中的运算符?

最佳答案

您必须要求在Numeric 中进行乘法运算协议(protocol):

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 { $0 * right }
}

关于swift - 是否可以在 Swift 中使用自定义运算符定义 [Int] * Int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36868048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com