通常,如果您編寫此代碼;從void函數返回值時,Swift 3編譯器顯示錯誤消息
func test1() {
return CGPoint.zero
}
,編譯器會告訴你,在虛空功能
這是非常好的
意想不到的非空返回值。每個人都知道他們做錯了什麼。
但這個代碼將導致編譯說不同的東西:
func test2() { let a: CGFloat = 1 return CGPoint(x: 0.0, y: a) }
編譯器現在說:
不能調用類型「CGPoint」初始化與類型的參數列表「(與這些部分匹配參數列表存在:「重載
音符 'CGPoint':X::雙,Y CGFloat的)(X:CGFloat的,Y:CGFloat的),(X:雙,Y:雙)
現在我很困惑。
爲什麼不提編譯任何約在void函數返回值,而是抱怨調用
CGPoint.init
與(x: 0.0, y: a)
,這是完全沒?由於
0.0
是float文字,並CGFloat
符合BinaryFloatingPoint
這符合ExpressibleByFloatLiteral
,0.0
是在編譯時轉換爲CGFloat
。因此,應使用CGPoint(x: CGFloat, y: CGFloat)
初始值設定項。爲什麼編譯器會抱怨CGPoint
無法用(x: Double, y: CGFloat)
進行初始化?我以爲這是因爲編譯器看到我正在返回一個值,我不應該並且停止對錶達式進行計算,所以
0.0
不會被轉換爲CGFloat
。但是如果是這樣的話,編譯器應該說關於在void函數中返回一個值!這是錯誤還是有用嗎?
CGPoint(x :, y:)'有(至少)三個重載。似乎編譯器試圖找到一個返回'Void',失敗,然後發出該錯誤消息。 –
我現在看到!謝謝! @MartinR – Sweeper