2016-04-26 86 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

相關問題