2016-12-31 101 views
2

我在這裏第一次進入swift,並且偶然發現了一個閉包語句,這對我來說並沒有什麼意義,基於我目前對閉包的理解書面。這實際上是一個由兩部分組成的問題,因爲我也沒有完全理解這個閉包條件下的條件約束背後的意圖/解釋。瞭解無返回類型的閉包語法

的代碼,我被拋出的塊是這樣的:

FIRAuth.auth()?.createUser(withEmail: email, password: password) { 
    (user, error) in if let error = error { 
     print(error.localizedDescription) 
     return 
    } 
} 

我的理解是,封閉的需求,以便從代碼的位指定上述基於關閉文檔定義(something1, something2) ->()的返回類型,是否只是意味着swift可以通過不包括->()推斷出一個無效回報?

我的假設是,條件綁定語句只是說'如果一個錯誤參數傳遞給這個閉包,然後打印錯誤?

請儘可能詳細地解釋您的解釋,以便我可以進一步理解。乾杯!

+1

您發佈的代碼的上下文是什麼?它是封閉的內容嗎? (裏面有一套'{}'?) – nathan

+1

@MattSanford我認爲你還錯過了一個關閉'} – Alexander

+0

你是對的@Alexander –

回答

3

下都是等價

func foo1() ->() { } 
func foo2() ->() { return() } 
func foo3() ->() { return Void() } 
func foo4() ->() { return } 

func foo5() -> Void { } 
func foo6() -> Void { return() } 
func foo7() -> Void { return Void() } 
func foo8() -> Void { return } 

func foo9() { } 
func foo10() { return() } 
func foo11() { return Void() } 
func foo12() { return } 

print(type(of: foo1)) // (()) ->() 
// ... 
print(type(of: foo5)) // (()) ->() 
// ... 
print(type(of: foo9)) // (()) ->() 
// ... 

如果沒有返回類型被提供給函數(/ closure),則推斷出空元組類型(其由Void分類)被推斷。但是,我們可能會明確提供型號,可能爲()型號)或Void。從the language guide - functions

功能沒有返回值

功能並不需要定義一個返回類型。 ...

...

嚴格地說,這個版本的greet(person:)功能不 仍返回一個值,即使沒有返回值的定義。 功能沒有定義的返回類型返回特殊值 類型Void。這只是一個空元組,寫成()

相反,如果沒有return在一個功能塊的端給定,這將是一樣明確地返回一個實例的空的元組的,即()(所述)。這也可以簡寫爲return

+0

奇怪的是'type(of:foo1)'被打印爲'(()) - >()'... – jtbandes

+0

哇我不知道有太多的方法來寫同樣的東西。這非常有幫助 –

+0

@jtbandes它看起來有點奇怪,但我認爲它遵循一般約定:閉合(參數和返回類型)的組合類型註釋中的參數的類型註釋由括號括起來,需要例如當在閉包的主體中明確包含類型註釋(例如'{(arg:Int) - > Int in 2 * arg}')時。或者,也許你提到另一個怪異點,我錯過了這一點?感謝您的反饋! – dfri

1

()是空的元組。 Swift中的Void只是()的類型別名。如果函數或閉包沒有指定返回類型,則假定爲()

爲了避免混淆,(user, error) in應在自己的行:

FIRAuth.auth()?.createUser(withEmail: email, password: password) { user, error in 
    if let error = error { 
     print(error.localizedDescription) 
     return 
    } 
} 

我建議使用一個guard語句來執行早日迴歸:

FIRAuth.auth()?.createUser(withEmail: email, password: password) { user, error in 
    guard error == nil else { 
     print(error!.localizedDescription) 
     return 
    } 

    // There's no error, carry on... 
} 
+0

在那個函數中我還有其他的一些事情,所以我想結束如果實際上存在錯誤,則執行。 '(用戶,錯誤)'在線上會怎樣導致混淆? (我的第二部分原始問題) –