2016-04-26 62 views
2

我想定义一个新的运算符并将数组[Int]的每个元素乘以Int,例如[3, 2, 10] * 10是否可以在Swift中使用自定义运算符来定义[Int] * Int?

然而,因为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 
} 

然而,这会产生一个错误: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确实已经有*运营商定义。

那么还有可能在Swift中定义[Int] * Int运算符?

回答

2

您有权要求在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 { $0 * right } 
} 
+0

实施OOOOH它的超级真棒。那么我首先试图用map来定义它,但是当我打开墙时,我更简单地确定问题不是来自'map'。非常感谢。 – Blaszard

相关问题