【问题标题】:How do you put a guard statement inside a function in Swift?你如何在 Swift 的函数中放置一个保护语句?
【发布时间】:2015-12-08 06:08:12
【问题描述】:

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

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

为什么上面的不正确? Xcode 在guard 闭包中的return 语句上给我错误“非空函数应该返回一个值”,就像它认为return 语句是函数的return 语句一样。如何区分 guardreturn 语句和函数的 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 函数中使用保护语句。我尝试用breakcontinue 替换return(在guard 示例中),但都不起作用。

谢谢!

【问题讨论】:

    标签: swift function cocoa-touch


    【解决方案1】:

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

    【讨论】:

    • 如果我返回一个空字符串,那么这意味着函数将停止执行。如果我只想执行一个保护语句而不是整个函数怎么办?
    • 然后将else 留空。没有代码,没有要执行的东西,继续前进。但是,如果我没有指出这样做会使警卫声明毫无用处,那我就失职了。本来应该是为了检查你的数据的完整性,但是如果你检查了,结果不成功,然后又想继续执行,我一开始就看不到守卫的意思了。
    • 您不能将其留空。守卫必须有转移控制权。
    • 好吧,有道理。但如果是这种情况,您可以只使用if let,这样您也可以使用其他情况。 guard 语句更常用于执行某种数据操作并且需要在尝试访问之前确保数据存在的函数的开头。
    • @Jake:你可以guard 语句放在do-block 中,然后else case 会跳出do-block 而不是从功能。但是if let 要简单得多...
    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多