与swift中`return`的功能相混淆

Agu*_*ana 0 return ios swift

return在Swift中感到困惑.我知道它用于返回函数中的值,如果像这样使用:

func double(value: int) -> Int { 
    return value * 2
}
Run Code Online (Sandbox Code Playgroud)

但我经常只是看到return被使用,就像在这样guard的可选绑定中的语句:

guard let value = value else (
    print ("nothing")
    return
}
Run Code Online (Sandbox Code Playgroud)

那么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"
Run Code Online (Sandbox Code Playgroud)

即使我写过,我也会收到此错误return name.Xcode仍抱怨我没有返回值.是因为returnguard声明中吗?

那么,你能告诉我returnSwift 的目的吗?这对我来说很困惑.

Pau*_*w11 8

return没有任何参数返回Void.这种形式的return语句只能与返回的函数一起使用Void.

一旦return语句执行,函数退出,并在功能上没有更多的代码执行.由于你returnguard语句中有一个,所以第二个return name不会被执行(因为它没有返回的名字,所以无法执行),这就是你得到编译器错误的原因; 编译器会查看函数可以返回的所有路径,并确保所有这些路径都返回函数签名所说的内容.

你的问题中的函数表明它返回一个String,所以你不能简单地returnguard语句中说,因为它返回Void,违反了你的函数签名所表达的契约.

您可以返回不是的默认值Void:

func getTheName () -> String {
    guard let name = info["name"] else {
        return ""
    }
    return name
}    
Run Code Online (Sandbox Code Playgroud)

这可以使用nil-coalescing运算符更简洁地编写;return info["name"] ?? ""

您还可以return在返回的函数中使用Void(或者没有显式的返回类型,在这种情况下,它被隐含地理解为返回Void)

所以你可以有一个像这样的功能:

func maybePrint(theMessage: String?) -> Void {
    guard let msg = theMessage else {
        return
    }
    print(msg)
}
Run Code Online (Sandbox Code Playgroud)