2016-10-05 5 views
2

それは私が、単純な数のプロトコル持って、おそらく非常にシンプルですが、理由SWIFT用+演算子の私の実装を好きではない...
スウィフトあいまいなオーバーロードされた+演算子

protocol Number : CustomStringConvertible { 

    var doubleValue: Double { get } 

} 

を同様の単純な実装:

struct SimpleNumber : Number { 

    let doubleValue: Double 
    let description: String 

    init(_ double: Double) { 
     doubleValue = double 
     description = "\(double)" 
    } 
} 

とオペレータのオーバーロードのための拡張:

extension Number { 

    static func + (lhs: Number, rhs: Number) -> Number { 
     return SimpleNumber(lhs.doubleValue + rhs.doubleValue) 
    } 
} 

これまでのところ、とても良いです。しかし、今、私はその演算子を使用しようとするとき:

let number1: Number = SimpleNumber(1) 
let number2: Number = SimpleNumber(2) 
let number3: Number = number1 + number2; 

Xcodeは、演算子があいまいであることを知らせます。
だから、なぜですか?私の定義は2つのNumberオブジェクトに適合する唯一のものです。
私が間違って何をしているのですか?

答えて

1

演算子+は、エクステンションの内側にあるのではなく、グローバルfuncであるべきです。単に

func + (lhs: Number, rhs: Number) -> Number { 
    return SimpleNumber(lhs.doubleValue + rhs.doubleValue) 
} 

extension Number {  
    static func + (lhs: Number, rhs: Number) -> Number { 
     return SimpleNumber(lhs.doubleValue + rhs.doubleValue) 
    } 
} 

、それが動作します:+のあなたの定義を交換してください。あなたがしたことは、静的関数Number.+が作成されているのではなく、グローバル関数+が使用されていると思います...

+0

私はそれが愚かな間違いであることを知っていました...ありがとう! – Jofkos

+1

> 'あなたがしたことは、静的関数Numberを作成したものと思われます。+'また、拡張機能経由でプロトコルに関数を追加するようにも、この拡張機能を実装するすべての型にデフォルトの実装で新しい関数を追加します。だから多分質問からのコードは同じ署名 'Number。+' *と* 'SimpleNumber。+'を持つ2つの**静的関数を作成し、後者は既定で前者を呼び出します。それはあいまいさの原因かもしれません。 – user28434

関連する問題