[英]confused with the functionality of `return` in swift
我對Swift的return
感到困惑。 我了解它用於在函數中返回值,如果使用時是這樣的:
func double(value: int) -> Int {
return value * 2
}
但是我經常看到return
被使用,就像在一個可選的綁定中的guard
聲明中一樣:
guard let value = value else (
print ("nothing")
return
}
那么,只return
的guard
聲明的目的是什么? 實際上,解包可選值時,我不僅在guard
聲明中經常看到這種情況。 當我想使用字典中的可選字符串時,我總是在編寫代碼時發現此問題。
let info = ["name": "sarah", "hometown": "sydney"]
class UserInfo {
func getTheName() -> String {
guard let name = info["name"] else { return }
return name
}
}
// Compile time error: "Non-void function should return a value"
即使我寫了return name
我也會收到此錯誤。 Xcode仍然抱怨我還沒有返回值。 是因為guard
聲明中的return
?
那么,能否請您告訴我Swift return
的目的? 這讓我感到困惑。
不帶任何參數的return
返回Void
。 這種形式的return
語句只能與返回Void
的函數一起使用。
一旦執行return
語句,該函數將退出,並且該函數中的其他代碼將不再執行。 由於在guard
語句中有一個return
,因此第二個return name
將不會執行(因為它沒有要return name
將無法執行),這就是為什么會出現編譯器錯誤; 編譯器會查看函數可以返回所有內容的所有路徑,並確保所有這些路徑都返回函數簽名說明的內容。
您問題中的函數聲明它返回String
,因此您不能簡單地在guard
語句中說return
,因為它返回Void
,違反了函數簽名所表示的約定。
您可以返回不是Void
的默認值:
func getTheName () -> String {
guard let name = info["name"] else {
return ""
}
return name
}
這可以使用nil-coalescing運算符更簡潔地編寫; return info["name"] ?? ""
您還可以在返回Void
的函數中使用return
(或沒有顯式的返回類型,在這種情況下,將其隱式理解為返回Void
)
因此,您可以使用以下功能:
func maybePrint(theMessage: String?) -> Void {
guard let msg = theMessage else {
return
}
print(msg)
}
您走在正確的軌道上。
在getTheName()內的保護聲明中,如果保護失敗,則“ return”關鍵字將嘗試退出函數本身。 但是該函數要求您返回一個String,因此會出現編譯器錯誤。
這是類似問題的另一個SO答案的一部分:
保護會強制您使用控制轉移語句退出作用域。 有4種可供您選擇:
return和throw都退出函數/方法continue可以在循環中使用(while / for / repeat-while)break可以在循環中使用(while / for / repeat-while)以退出立即作用域。 指定要中斷的標簽將使您可以立即退出多個作用域(例如中斷嵌套循環結構)。 使用標簽時,在if范圍內也可以使用break。 此外,您可以通過調用返回Never的函數(例如fatalError)退出范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.