2016-06-09 107 views
0

我是swift的初學者。Swift Closure編譯錯誤

下面的代碼沒有任何編譯錯誤

var test = { //no error 
    return "String" 
} 

而如果我添加一個字符串類型的變量測試,如下圖所示,編譯器會引發錯誤「功能產生預期的字符串類型。您的意思是有()」

var test:String = { // error 
    return "String" 
} 

據我所知,SWIFT能夠類型推斷的調用它。有人可以解釋爲什麼上面的代碼拋出編譯錯誤,其中第一個沒有。

謝謝

+1

請注意,您可以在Xcode上點擊一個變量來查看它的類型 - 看看Swift推斷它是什麼。你會在第一個例子中看到'test'是'() - > String',而不是'String'。 – Hamish

回答

3

在你的第一個例子,雨燕正確地使用類型推理來推斷出你的閉包作爲一個零-argument(Void /空的元組())閉合帶返回值String() -> String

var test = { 
    return "String" 
} 

print(test.dynamicType) //() -> String 

而在第二個示例中,您明確指定類型testString,這意味着嘗試將() -> String類型的閉包分配給它將是類型不匹配。

原因雨燕問你,如果你想打電話蓋子與()是,你實際上可以通話關閉單個時間(就像你調用一個函數引用函數的參數列表(...)) ,使用閉包的返回值(即String)爲您的test變量(其類型爲String)分配一個初始值。

var test2: String = { 
    return "String" 
}() // ok! assign "String" to test2 
+0

@ originaluser2謝謝! – dfri

+0

沒問題@dfri :) – Hamish

0

您嘗試將閉包分配給字符串變量。

如果你想作爲一個返回字符串塊明確鍵入您的變量,請

var test:() -> String = { 
    return "String" 
} 

如果你想關閉立即返回字符串,並將其分配給一個字符串變量,執行關閉

var test:String = { 
    return "String" 
}() 
2

在第一個例子中test() -> String類型,而不是String。爲了讓String你需要調用關閉:

var test = { 
    return "String" 
}() 

與第二個同樣的事情:

var test: String = { 
    return "String" 
}() // test is now String