2017-01-19 9 views
2

変数をバイナリ演算子に代入するときの型推論のポリシーはありますか? arrayOfIntsスワイプ配列の型は、演算子への代入とどのように扱われますか?

let arrayOfInts = [1,2,3] 
let arrayOfDoubles = [1.0, 2.0, 3.0] 
// arrayOfInts == arrayOfDoubles 
// Binary operator '==' cannot be applied to ... [Int] [Double] 
[1,2,3] == [1.0, 2.0, 3.0] // works? 
+0

リテラルは '[NSNumber]'や '[Double]'にアップキャストされているかもしれませんが、なぜか分かりません。 – matt

+2

配列のない簡単な例: '1.0 == 1'がコンパイルされますが、' let x = 1.0; y = 1とする。 x == y'はそうではありません。 –

+2

しかし、Swiftの型推論が時には何と違うのかが示されている[Strange Swift numbers type casting](http://stackoverflow.com/questions/28813516/strange-swift-numbers-type-casting)を見てください。 (他の言語と比較して)期待されるかもしれない。 –

答えて

3

、デフォルトではコンパイラはタイプIntであることが、整数リテラルを推測します。したがってarrayOfInts[Int]です。 arrayOfDoublesを指定すると、コンパイラはデフォルトで浮動小数点リテラルの型がDoubleであると推測します。従って、arrayOfDoublesは、タイプ[Double]である。 [Int][Double]を比較することはできません(少なくとも標準ライブラリのオーバーロードは==ではありません)。したがって、コンパイラエラーが発生します。

しかし、発現[1, 2, 3] == [1.0, 2.0, 3.0]と - DoubleExpressibleByIntegerLiteralExpressibleByFloatLiteral両方に準拠ようスウィフトは、タイプDoubleあることが両方浮動小数点整数リテラルを推測することができます。したがって、[Double][Double]を比較しています - です。

関連する問題