0

我了解选项的使用足以知道何时需要使用感叹号解开选项。为什么警卫语句中不需要感叹号?

此代码可以工作和编译,但不使用感叹号:

struct Blog{

  var author:String?
  var name: String?

}

func blogInfo2(blog:Blog?){
  guard let blog = blog else {
    print("Blog is nil")
    return
  }
  guard let author = blog.author, name = blog.name else {
    print("Author or name is nil")
    return
  }
  print("BLOG:")
  print(" Author: \(author)")
  print(" name: \(name)")
}

如果您确实放置了感叹号,则此代码也可以使用:

struct Blog{

  var author:String?
  var name: String?

}

func blogInfo2(blog:Blog?){
  guard let blog = blog! else {
    print("Blog is nil")
    return
  }
  guard let author = blog.author!, name = blog.name! else {
    print("Author or name is nil")
    return
  }
  print("BLOG:")
  print(" Author: \(author)")
  print(" name: \(name)")
}

这不是有点矛盾,还是有人可以清楚地解释为什么不需要感叹号?

4

3 回答 3

4

guard let unwrapped = optional是一个可选装订(不幸的是,没有直接指向正确书籍部分的链接)。它安全地尝试解开可选中的值。如果有值,则解包成功,并将该值分配给给定名称。

您应该大力支持使用可选绑定,使用guardor if(区别在于“解包”名称的范围)而不是使用强制解包 with !。强制展开失败是致命错误;你的程序只会崩溃。

于 2016-07-15T19:43:00.947 回答
2

我了解选项的使用足以知道何时需要使用感叹号解开选项。

如果你做出这样的断言,我觉得你对Swift Optionals 的理解还不够。

Optional 背后的合约是它可能是 nil 也可能不是 nil;你不知道它,因此你必须先打开它(比如打开一个盒子,看看里面有什么),然后才能知道。

该框可能为空(nil 可选),也可能包含一个值。

使用强制展开 ( )的理由很少很少,在大多数(但不是全部)情况下,这通常被认为是一种不好的做法。!

继续打个比方,通过强制拆开东西,你是说这个盒子里有东西,我希望你相信我,不要检查

知道一个 Empty box 会使你的应用程序崩溃,这是一件非常危险的事情,考虑到 Swift 中引入了 Optionals 来保护你免受此类崩溃的影响。

这些if let/guard let陈述基本上是在盒子里偷看的,如果有东西,它们会给你,但如果盒子是空的,它们也让你有机会做其他事情。

Xcode在使用 IBOutlets 时确实会强制展开,因为按照设计约定,这些对象将在您可以在视图控制器中使用它们时可用,但除非您 100% 确定某个值不会出现,nil否则它几乎总是更好(和未来的证明)使用guard语句(或if)。

根据我的经验,即使您确定guard了,扔掉 a并忘记未来可能出现的问题仍然更安全。

于 2016-07-15T19:53:47.170 回答
1

感叹号“force”解开一个可选项。guard letif let在不强制任何内容的情况下展开它,因此不使用感叹号。

于 2016-07-15T19:42:07.317 回答