2017-09-26 53 views
0

我很快與'return'混淆。我明白,如果它是用來在函數返回值,如果是用這樣的事情我瞭解與swift中的'return'功能混淆

func double (value: int) -> Int { 
return value * 2 
} 

,但我經常看到的只是「回報」時,我的意思是在後衛聲明類似的可選這樣的綁定:

guard let value = value else (
print ("nothing") 
return 
} 

那麼,在這樣的守衛聲明中,只是'返回'的目的是什麼?其實,我經常不僅看到可選綁定的警戒聲明。在編寫代碼時,當我想使用可選的字符串,從字典

let info = ["name":"sarah","hometown":"sydney"] 

class UserInfo { 



func getTheName() -> String { 
    guard let name = info["name"] else {return} 

    return name 
} 


} 
xcode error : non-void function should return a value (even though i 
have written 'return name') 
即使我已經寫了「迴歸名字」

我一直覺得這個問題,但Xcode中仍然認爲我還沒有返回值。是否因爲警戒聲明中的「返回」?

那麼,您能否告訴我快速返回的目的?這令我感到困惑。

+0

以'guard'聲明中,'let'語句作用域塊的外面,所以你不能用它的'else'塊內。 –

回答

6

return沒有任何參數返回Void。這種形式的return聲明只能與返回Void的函數一起使用。

執行return語句後,該函數將退出並且您的函數中沒有更多代碼會執行。由於guard語句中有return,因此第二個return name將不會執行(因爲它沒有返回名稱,所以不會執行它),這就是爲什麼會出現編譯器錯誤的原因;編譯器會查看函數返回的所有路徑,並確保所有這些路徑返回函數簽名所表示的路徑。

在你的問題的功能狀態,它返回一個String,所以你不能簡單地說returnguard語句返回Void,侵犯了您的函數簽名表達了合同。

你可以返回一個默認值不是Void

func getTheName() -> String { 
    guard let name = info["name"] else { 
     return "" 
    } 
    return name 
}  

這可能更加簡潔使用未繳合併運算寫的; return info["name"] ?? ""

您還可以使用return在返回Void一個函數(或沒有明確的返回類型,在這種情況下,它隱含理解爲返回Void

所以,你可以有這樣一個功能:

func maybePrint(theMessage: String?) -> Void { 
    guard let msg = theMessage else { 
     return 
    } 
    print(msg) 
} 
+0

'nil'或'Void'都不是「Nothing」。 「無」在Swift中是非常具體的含義,即'Nothing'類型。是正確的,這些函數返回'()'(亦稱'Void'的'Void'類型的唯一實例) – Alexander

+0

其實,這是不正確;你需要明確地返回'nil'作爲可選;我已經更新了我的答案。謝謝 – Paulw11

0

你在正確的軌道上。

在getTheName()中的guard語句中,如果警衛失敗,'return'關鍵字將嘗試退出函數本身。但是該函數需要你返回一個字符串,因此你會得到編譯器錯誤。

這裏是另一部分,這樣回答過類似的問題:

衛隊你使用控制轉移語句退出的範圍。 有4個供您選擇:

回報,扔都退出函數/方法繼續可循環內使用 (在/爲/重複,同時)破可循環使用 (在/爲/重複同時)退出眼前的範圍。指定 標籤突破將讓你一次(例如 打破了嵌套循環結構)退出多個範圍。當使用標籤時,break可以在範圍內使用 。此外,您可以通過調用一個返回從不的函數(如fatalError)退出 。

Stack Overflow: If the Swift 'guard' statement must exit scope, what is the definition of scope?