5

私はいくつかの簡単な UIView レイアウト計算を迅速に実行しようとし、次のコード行を試しました...

var offset: CGFloat = (bounds.width / 2.0) - ((sortedSymptoms.count * bounds.height) / 2.0)

コンパイラから次のエラーが発生しました。

cannot invoke '-' with an argument list of type '(($T6), ($T17))'
        var offset: CGFloat = (bounds.width / 2.0) - ((sortedSymptoms.count * bounds.height) / 2.0)
                              ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    

コンパイラ エラーはそれほど役に立ちませんが、Double、Int、および CGFloat の間に何らかの型の競合があるようです。CGFloats の明示的な作成をいくつか散りばめることで、コンパイルする行を取得できましたが、これが正しい方法であるとは信じられません。

var offset: CGFloat = (bounds.width / CGFloat(2.0)) - ((CGFloat(sortedSymptoms.count) * bounds.height) / CGFloat(2.0))

正しい方法は何ですか?

4

1 に答える 1

8

これは Swift の既知の問題であり、開発チームはCGFloat特にこの問題の改善に取り組んでいます。しかし、現時点では、はい、それがあなたの書き方です。

devforums からのいくつかのフォローアップ (嬉しいことも悲しいこともあるかもしれませんが、少なくとも現在の状況を大まかに説明しています): https://devforums.apple.com/message/1026028#1026028

ここでの主な問題は、リテラル 2.0 が に強制されないことCGFloatであることに注意してください。ただしcount、意図的に常にキャストが必要になる可能性があります。数値型の間で常に安全に変換できるとは限りません。Swift は、これらの種類のキャストを行うたびに意図的に考慮するよう強制します。ただし、コンパイル時にリテラル変換が安全かどうかを判断できる必要があるため、修正できるはずです。

于 2014-09-26T19:20:21.917 に答える