2016-04-26 14 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の多くがたくさん発生しました。 Intはすでに*オペレータを持っていないものの、

enter image description here

、この作業は非常に多くの時間を実行した理由私はわからないんだけど、今はそれがカスタム*演算子を定義するための最初の場所で可能ですかしら定義された。

Swiftで[Int] * Int演算子を定義することはできますか?

答えて

2

あなたはNumeric プロトコルで乗算演算を必要とする必要があります。そうしないとnewArray.append(i * right)での乗算は 定義されていない

protocol Numeric { 
    func *(lhs: Self, rhs: Self) -> Self 
} 

はあなた

func *<T: Numeric> (left: T, right: T) -> T { 
    return left * right 
} 

は(スタックオーバーフローをもたらす、再帰的に自分自身を呼び出す)を必要としません。あなたのnew演算子自体の実装は を簡素化することができる

(すでに今削除された答えで説明したように)

func *<T: Numeric> (left: [T], right: T) -> [T] { 
    return left.map { $0 * right } 
} 
+0

にOooohのそれは超素晴らしいです。さて私はマップを使って最初にそれを定義しようとしましたが、私が壁に衝突した後、問題がマップから来ないことを確認するのがより簡単になりました。本当にありがとう。 – Blaszard

関連する問題