2017-07-02 35 views
0

爲什麼第一個函數調用在第二個函數調用產生錯誤時不會產生任何錯誤?我沒有調用函數,只是簡單地調用它。兩個函數之間的差異是參數的數量。爲什麼調用一個函數,而不是傳遞一個參數值的工作,但更多沒有?

func hello(firstName: String) { 
print("Hello \(firstName)") 
} 
hello(firstName:) 

func hello(firstName: String, lastName: String) { 
print("Hello \(firstName) \(lastName)") 
} 
hello(firstName:, lastName:) 
+2

這是因爲,哦,等等,我的水晶球在哪裏看到你得到的錯誤類型? – i6x86

+0

在第一種情況下,您正在創建一個具有函數簽名的語句,如果您想要執行相同操作,則必須添加'_',因爲您正在創建參數列表,但不傳遞值。 - > func(a:_,b:_) – Efren

回答

2

The Swift Book不含有易於閱讀的描述,但你的第一代碼是在夫特有效的表達式,它返回(String)->Void類型的閉合:

func hello(firstName: String) { 
    print("Hello \(firstName)") 
} 

var closure: (String)->Void = hello(firstName:) 
closure("Taro") //->Hello Taro 

在你的第二代碼, hello(firstName:, lastName:)不是斯威夫特一個有效的表達式,但hello(firstName: lastName:)是有效的:

func hello(firstName: String, lastName: String) { 
    print("Hello \(firstName) \(lastName)") 
} 
//hello(firstName:, lastName:) //<-invalid 
var closure2: (String, String)->Void = hello(firstName: lastName:) 
closure2("Taro", "Yamada") //->Hello Taro Yamada 

也許你已經見過這種符號的側面#selector(),但是這樣的標記也可以在#selector()之外使用,如上所示。

+0

「Swift Book不包含易於閱讀的描述」 - 您是輕描淡寫的主人 – CRD

相關問題