【问题标题】:Unwrapping in guard clause在保护条款中展开
【发布时间】:2015-11-17 23:11:35
【问题描述】:

我有这个函数使用guard 来确保参数正确:

func foo(bundle: NSBundle?, _ url: NSURL?)->Bool{

    guard let _ = url, let _ = bundle  else{
        print("crap")
        return false
    }


    return true
}

我注意到如果任何参数为 nil,else 子句将运行。它表现为 OR 子句。

但是,我需要检查两者是否为零(AND)。

我该怎么做?

【问题讨论】:

    标签: swift cocoa swift2


    【解决方案1】:

    如果您实际上并不关心您的绑定值(鉴于 _ 名称,我假设您不关心),您可以这样做:

    func foo(bundle: NSBundle?, _ url: NSURL?) -> Bool {
        guard url != nil || bundle != nil else {
            print("crap")
            return false
        }
    
        return true
    }
    

    如果您确实想要绑定这些值,那么您无法使用单个 guard 语句来完成此操作。如果它无法从任何一个选项中解包一个值,那么它将执行else 块,正如您所指出的。

    如果您仍然打算使用保护语句,则必须像我上面所说的那样放入保护,然后是各种if let 语句以适当地解开事物(或者只是省略保护并在其中添加一个 else 语句下面的代码是错误的情况):

    func foo(bundle: NSBundle?, _ url: NSURL?) -> Bool {
        guard url != nil || bundle != nil else {
            print("crap")
            return false
        }
    
        if url == nil, let someBundle = bundle {
            // Handle the bundle only case
        }
        else if bundle == nil, let someUrl = url {
            // Handle the url only case
        }
        else if let someUrl = url, let someBundle = bundle {
            // Handle the case for both
        }
    
        return true
    }
    

    【讨论】:

      【解决方案2】:

      这不是一个守卫声明的工作。你想要的是:

      if(url == nil && bundle == nil)
      {
          print("crap")
          return false
      }
      return true
      

      【讨论】:

        猜你喜欢
        • 2012-11-25
        • 2011-10-06
        • 1970-01-01
        • 2011-10-06
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多