guard let cause,从整个功能块返回

时间:2015-10-25 01:43:57

标签: ios swift

以下代码从 guard let details 返回,但它不会执行其他打印状态。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    let testDictionary:[String:AnyObject] = ["a":NSMutableArray()]

    let result = testDictionary["C"]

    print("Before details Check")
    guard let details = result where details.isKindOfClass(NSArray) else {
        return false
    }
    print("Returned Result \(details)")
    print("After Details Check")
    return true
}

为什么gaurd之后的陈述没有被执行?我做错了什么?

2 个答案:

答案 0 :(得分:0)

使用一个键为“a”的项创建测试词典。然后你从同一个字典中用“C”键询问一个对象。 “细节”当然是零,所以你回复假。




答案 1 :(得分:0)

来自Swift文档中的"Statements"

  

退回声明

     

return语句出现在函数或方法的主体中   定义并导致程序执行返回调用   功能或方法。

  

警卫声明

     

guard语句用于将程序控制转移到范围之外   如果不符合一个或多个条件。
  ...
  保护声明的else子句是必需的,必须要么调用   标有noreturn属性或传输程序的函数   在守卫声明的封闭范围之外控制......

如果guard let details =条件失败,则return "立即"从当前函数返回。你不能简单 继续因为details未定义。这正是如此 guard语句用于。

您可以通过引入本地范围来解决您的问题:

print("Before details Check")
checkLabel: do {
    guard let details = result where details.isKindOfClass(NSArray) else {
        break checkLabel
    }
    print("Returned Result \(details)")
}
print("After details Check")

此处,break checkLabeldo - 范围之后继续执行if 条件失败。

但更简单的方法是使用if-let代替guard-let

print("Before details Check")
if let details = result where details.isKindOfClass(NSArray) {
    print("Returned Result \(details)")
}
print("After details Check")