你如何在Swift函数中放置一个guard语句?

时间:2015-12-08 06:08:12

标签: swift function cocoa-touch

我不明白为什么你不能在回归函数中有一个警卫声明。

func sayHello(text: String?) -> String {
    guard let whatever = text else {
        ...
        return
    }
    return "aString"
}

为什么以上不正确? Xcode给出了错误"非void函数应该返回一个值"在return闭包中的guard语句中,就像它认为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语句。我尝试将return(在guard示例中)替换为breakcontinue,两者均无效。

谢谢!

1 个答案:

答案 0 :(得分:12)

这里的重点是......你不能在完成处理程序的执行内部返回。在第二种情况下,如果要返回关于完成处理程序结果的布尔值,则必须创建一个局部变量,将其设置在处理程序的结果中,然后将其返回到处理程序之外。至于你面临的第一个问题,Xcode抱怨是因为你已经声明函数返回一个字符串,但是在你的else语句中你试图返回void,这违反了函数的返回类型。你可以做你想做的事,但你必须至少返回一个空字符串。