通常、このコードを書くと、Swift 3コンパイラは、void関数から値を返すときに間違ったメッセージを表示します。
func test1() {
return CGPoint.zero
}
コンパイラはあなたに非常にいいです、ボイド機能
で
予期せぬvoid以外の戻り値を教えてくれます。誰もが間違ったことを知っています。
しかし、このコードは、コンパイラが別の何かを言うことになります:
func test2() { let a: CGFloat = 1 return CGPoint(x: 0.0, y: a) }
コンパイラ今言う:
型の初期化子を呼び出すことができないタイプの引数リストで「するCGPoint」「( (x:Double、y:CGFloat) '
注:「CGPoint」のオーバーロードは、これらの部分一致するパラメータリスト(x:CGFloat、y:CGFloat)、(x:Double、y:Double)で存在します。
今私は混乱しています。
なぜコンパイラは、void関数に値を返すことについて何言及していない、と代わりに完全に罰金である、
(x: 0.0, y: a)
とCGPoint.init
を呼び出すことに文句を言いますか?0.0
のでリテラルフロートであり、そして
CGFloat
はExpressibleByFloatLiteral
に準拠したBinaryFloatingPoint
に準拠し、0.0
は、コンパイル時にCGFloat
に変換されます。その結果、イニシャライザCGPoint(x: CGFloat, y: CGFloat)
が使用されているはずです。コンパイラはなぜCGPoint
を(x: Double, y: CGFloat)
で初期化できないと不平を言いますか?コンパイラが私が値を返していないことを見て、表現を取り除くのをやめて、
0.0
がCGFloat
に変換されていないことがわかったからです。しかし、その場合、コンパイラは何かにvoid関数の値を返すと言っているはずです。これはバグですか?
CGPoint(x :, y:)には少なくとも3つのオーバーロードがあります。コンパイラが 'Void'を返すものを見つけようとすると失敗し、そのエラーメッセージを出力するようです。 –
私は今参照してください!ありがとうございました! @MartinR – Sweeper