1

Duration と Frequency (逆の Duration) を表す値の型があります。それらを使って計算したいので、特に次の演算子のオーバーロードがあります。

func * (a:Frequency, b:Duration) -> Double {
    return a.numerator * (b / a.denominator)
}

私はこれらをグラフィックス コードで頻繁に使用するためCGFloatDouble. そこで、次の砂糖を加えました。

func * (a:Frequency, b:Duration) -> CGFloat {
    return CGFloat(a * b)
}

これはSwift2.2でうまくいきました。コンパイラは、予想される戻り値の型に基づいて適切なものを見つけて適用したようです。しかし、Swift3 では、これはもはや当てはまらないように見えますか? Ambiguous use of operator '*'エラーが発生します。元の関数とエラーのある関数の 2 つの候補が見つかったこともわかります。

これは、Swift3 で予定されている変更で予想されることですか? それは私が以前に逃げたものですが、持つべきではありませんか?それとも回帰?

アップデート

これを行うために、独自の特別なクラスは必要ありません。XCode7 プレイグラウンドでは、以下は問題ありません。

func * (a:String, b:Double) -> Double {
    return Double(a)! * b
}

func * (a:String, b:Double) -> CGFloat {
    return CGFloat(a * b)
}

let x:CGFloat = "4.2" * 3.0
let y:Double = "-1.1" * 22.2

しかし、XCode8 では上記のエラーで失敗します

4

1 に答える 1

1

以前のバージョンのコンパイラのバグだったと思います。

func * (a:String, b:Double) -> Doublefunc を使用するか、再帰呼び出しかを判断することはできませんfunc * (a:String, b:Double) -> CGFloat(はい、CGFloat をパラメーターとして受け取る CGFloat のコンストラクターがあります)。

このようなコードを実装する場合 (本当に必要な関数を明示する)、コンパイルは正しい関数を推測できます。

func * (a:String, b:Double) -> CGFloat {
    let result: Double =  a * Double(b)
    return CGFloat(result)
}
于 2016-06-14T23:33:16.023 に答える