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