迅速反向防守问题

时间:2018-01-24 18:07:04

标签: ios swift

我有关闭可能会返回错误。它看起来像:

session.dataTask(with: url) { (data, response, error) in

接下来我想处理错误。我想使用guard语句来解包错误,如果存在,则显示alert和return函数。但我怎么能执行像

这样的事情
guard !(let error = error) else { return }

我不能。我可以检查nil然后再次解开错误,但那看起来很难看。或者我可以使用,如果让我解开,但为了错误检查,我更喜欢看守。那么,有没有办法很好地写下面的?

guard !(let error = error) else { return }

3 个答案:

答案 0 :(得分:6)

不要与框架作斗争

  • 如果您想在中使用展开的可选,则大括号使用if let

    if let error = error {
       print(error)
       return
    }
    
  • 如果你想使用 之后的 括号,请使用guard let

    guard let error = error else {
       return
    }
    print(error)
    
  • 如果error的(未展开)内容无关紧要,请检查nil

    guard error == nil else { ... 
    if error == nil { ... 
    

答案 1 :(得分:4)

documentation表示调用闭包时:

  • data有值,errornil(如果请求成功),
  • datanilerror有值(如果请求失败)。

您真正感兴趣的是数据和成功 无论如何你必须(以某种方式)解开。

因此我会检查data是否有值。如果失败,则表示您有错误。为了避免强制展开,请使用nil-coalescing运算符:

session.dataTask(with: url) { (data, response, error) in

    guard let data = data else {
        // The request failed.
        let message = error?.localizedDescription ?? "Unknown error"
        // Present message ...
        return
    }

    // The request was successful. 
    // Process data ...
}

答案 2 :(得分:3)

guard error == nil else {
    print(error!)
    return
}

您可以安全地强制解开身体中的错误,因为您知道它不是空指针。

你最好用

if let error = error {
    //handle error
    return
}