我对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仍抱怨我没有返回值。是因为return
声明中的guard
吗?
那么,您能告诉我Swift中return
的目的吗?这对我来说很困惑。
答案 0 :(得分:8)
Void
会返回return
。 return
语句的这种形式只能与返回guard
的函数一起使用。
执行return name
语句后,函数退出,函数中不再执行任何代码。由于String
语句中有return
,因此第二个guard
将不会被执行(因为它没有返回的名称,所以无法执行),这是为什么会出现编译错误;编译器会查看函数可以返回的所有路径,并确保所有这些路径都返回函数签名所说的内容。
您的问题中的函数指出它返回Void
,因此您不能简单地在Void
语句中说func getTheName () -> String {
guard let name = info["name"] else {
return ""
}
return name
}
,因为它返回return info["name"] ?? ""
,违反了合同表示的合同。
您可以返回不是return
的默认值:
Void
使用 nil-coalescing运算符可以更简洁地编写; Void
您还可以在返回func maybePrint(theMessage: String?) -> Void {
guard let msg = theMessage else {
return
}
print(msg)
}
的函数中使用{{1}}(或者没有明确的返回类型,在这种情况下隐含地理解为返回{{1}})
所以你可以有这样的功能:
{{1}}
答案 1 :(得分:0)
你走在正确的轨道上。
在getTheName()内的guard语句中,如果防护失败,'return'关键字将尝试退出函数本身。但是该函数要求您返回一个String,因此您会收到编译器错误。
以下是对类似问题的另一个SO答案的一部分:
guard会强制您使用控制转移语句退出范围。 有4种可用:
返回并抛出退出函数/方法继续可以使用 在循环内(而/ for / repeat-while)可以在循环中使用break (while / for / repeat-while)退出直接范围。指定一个 要打破的标签将允许您一次退出多个范围(例如 打破嵌套循环结构)。使用标签时,休息可以 也适用于范围。此外,您可以退出范围 调用返回Never的函数,例如fatalError。
Stack Overflow: If the Swift 'guard' statement must exit scope, what is the definition of scope?