2016-12-21 36 views
0

通常,如果您編寫此代碼;從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這符合ExpressibleByFloatLiteral0.0是在編譯時轉換爲CGFloat。因此,應使用CGPoint(x: CGFloat, y: CGFloat)初始值設定項。爲什麼編譯器會抱怨CGPoint無法用(x: Double, y: CGFloat)進行初始化?

我以爲這是因爲編譯器看到我正在返回一個值,我不應該並且停止對錶達式進行計算,所以0.0不會被轉換爲CGFloat。但是如果是這樣的話,編譯器應該說關於在void函數中返回一個值

這是錯誤還是有用嗎?

+6

CGPoint(x :, y:)'有(至少)三個重載。似乎編譯器試圖找到一個返回'Void',失敗,然後發出該錯誤消息。 –

+0

我現在看到!謝謝! @MartinR – Sweeper

回答

1

CGPoint有三個重載初始化使用相同的參數名稱:

public init(x: CGFloat, y: CGFloat) 
public init(x: Double, y: Double) 
public init(x: Int, y: Int) 

您將與

let v: Void = CGPoint(x: 1.0, y: 2) 
// error: cannot invoke initializer for type 'CGPoint' with an argument list of type '(x: Double, y: Int)' 
// note: overloads for 'CGPoint' exist with these partially matching parameter lists: (x: Int, y: Int), (x: Double, y: Double) 

下面是另一個例子展示效果得到同樣的錯誤消息:

struct A { 
    init(x: Double, y: Double) { } 
} 

struct B { 
    init(x: Double, y: Double) { } 
    init(xi: Int, yi: Int) { } 
} 

struct C { 
    init(x: Double, y: Double) { } 
    init(x: Int, y: Int) { } 
} 

let v1: Void = A(x: 1, y: 2.0) 
// error: cannot convert value of type 'A' to specified type 'Void' (aka '()') 

let v2: Void = B(x: 1, y: 2.0) 
// error: cannot convert value of type 'B' to specified type 'Void' (aka '()') 

let v3: Void = C(x: 1.0, y: 2.0) 
// error: cannot convert value of type 'C' to specified type 'Void' (aka '()') 

let v4: Void = C(x: 1, y: 2.0) 
// error: cannot invoke initializer for type 'C' with an argument list of type '(x: Int, y: Double)' 

只在最後一行,C(x: 1, y: 2.0)個匹配兩個初始值設定項。 I 假設編譯器試圖與兩者匹配,無法在兩種情況下將 的返回值轉換爲Void,因此會發出不同的 錯誤消息。

錯誤消息不是很有幫助,因此您可能會考慮在http://bugs.swift.org處提交 錯誤報告。

+0

我現在明白了。我會做一個錯誤報告! – Sweeper

+0

https://bugs.swift.org/browse/SR-3470?filter=-2 – Sweeper