繁体   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