在Swift中,如何在函数中放置一个保护语句?

在Swift中,如何在函数中放置一个保护语句?,swift,function,cocoa-touch,Swift,Function,Cocoa Touch,我不明白为什么在返回函数中不能有一个guard语句 func sayHello(text: String?) -> String { guard let whatever = text else { ... return } return "aString" } 为什么上面的说法不正确?Xcode在guard闭包中的return语句中给出错误“non void function should return a value”,就像它认

我不明白为什么在返回函数中不能有一个guard语句

func sayHello(text: String?) -> String {
    guard let whatever = text else {
        ...
        return
    }
    return "aString"
}
为什么上面的说法不正确?Xcode在
guard
闭包中的
return
语句中给出错误“non void function should return a value”,就像它认为
return
语句是函数的
return
语句一样。如何区分
guard
return
语句和函数的
return
语句

在不返回的完成处理程序中也会发生同样的情况:

func anotherFunction() -> Bool {
    aFunction("hello", completion: { (status) -> Void in
        if status == "good" {
            return true // I want anotherFunction() to return this not the handler
        } else {
            return false
        }
    })
}
Xcode认为我试图让一个void完成处理程序返回一个
Bool
,相反,我希望函数根据完成处理程序的结果返回一个
Bool

我想我理解了为什么在完成处理程序示例中不能这样做,但是您肯定能够在非void函数中使用guard语句。我尝试将
返回
(在
保护
示例中)替换为
中断
继续
,两者都不起作用


谢谢

这里的要点是……您不能在完成处理程序的执行过程中返回。在第二种情况下,如果要返回关于完成处理程序结果的布尔值,则必须生成一个局部变量,在处理程序的结果中设置它,然后在处理程序外部返回该变量。至于您面临的第一个问题,Xcode正在抱怨,因为您已将函数声明为返回字符串,但在else语句中您试图返回void,这违反了函数的返回类型。您可以执行您试图执行的操作,但必须至少返回一个空字符串

如果我返回一个空字符串,那么这意味着函数将停止执行。如果我只想执行一条保护语句,而不是执行整个函数,那该怎么办?然后将
else
留空。没有代码,无需执行,继续前进。但如果我不指出这样做会使警卫声明毫无用处,那我就是失职了。它本应用于检查数据的完整性,但如果检查结果不成功,但又想继续执行,我首先看不到保护的意义。你不能将其留空。警卫必须有转移控制权。好的,这是有道理的。但是如果是这种情况,您可以使用
if let
,这样您也可以使用else。
guard
语句更常用于执行某种数据操作的函数的开头,并且在尝试访问它之前需要确保数据在那里。@Jake:您可以将
guard
语句放在
do
-块中,然后else案例脱离do块,而不是从函数返回。但是
如果let
更简单。。。