【问题标题】:guard let foo = foo VS guard foo != nil in SwiftSwift 中的 guard let foo = foo VS guard foo != nil
【发布时间】:2022-01-20 05:07:43
【问题描述】:

如果任务只是解开值,我不明白制作无用常量的概念:

guard let foo = foo else { return }

guard foo != nil else { return }

这些陈述之间有什么区别?不使用后者的原因是什么?

下面是使用 guard let 的一些例子:

var array: [String] = ["pineapple", "potato", "corn"]

guard let lastElement = array.last, lastElement == "corn" else { return false }

并且不使用 let:

guard array.last == "corn" else { return false }

我不能只使用第二种方法,因为它更干净、更简单并且可能更节省内存吗?

【问题讨论】:

  • 您在编辑之前的问题更有意义 - 通过您的编辑,array 不能是 nil,因为它被定义为 [String]array.last 将失败而不是 array?.last 如果它是。回滚到原来的问题可能更好。
  • 请发布您的实际代码。 array != nil ??? last 是可选的,但您的 array 不是
  • guard foo != nil else { return } 在您不想使用 foo 的值但工作流的修改将依赖于其状态设置的情况下很有用

标签: ios swift guard


【解决方案1】:

在您的第一个示例中,foo 变为非可选。所以,你可以这样做:

guard let foo = foo else { return }
foo.doMethod()

虽然没有可选绑定,但您仍然有一个 Optional:

guard foo != nil else { return }
foo?.doMethod()

有很多时候,具有非可选值更容易处理,包括能够避免使用 ! 强制展开,因此第一个代码示例有很多实用性。

就第二个版本而言,您可以在要进行nil 检查的地方使用它,但实际上可能不会在您检查它的范围内使用该值。


在您使用 [String] 类型数组的示例中,是的,您可以在没有可选绑定的情况下进行第二次比较,以检查是否存在 last 元素:

guard array.last == "corn" else { return false }

你说得对,这样更干净。但是,它极不可能像您推测的那样更“内存效率”,因为编译器可能会优化掉临时可选绑定。

【讨论】:

  • foo 的非Optional 本地绑定相比仅检查!= nil 的另一个好处:如果foo 否则引用Optional 属性,则该属性可能是即使在guard 通过之后,也分配了nil 值。由于您每次访问都会查找foo 的值,这可能会导致令人惊讶的行为;而使用本地绑定,即使属性更改,您的本地变量也不会。
  • 是的——很好的补充!
猜你喜欢
  • 1970-01-01
  • 2017-06-10
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多