簡體   English   中英

快速與“ return”的功能混淆

[英]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
}

那么,只returnguard聲明的目的是什么? 實際上,解包可選值時,我不僅在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)退出范圍。

堆棧溢出:如果Swift'guard'語句必須退出范圍,那么范圍的定義是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM