在Swift中,guard let foo = foo与guard foo!= nil的作用相同。

3

如果任务仅是解包值,我不理解创建无用常量的概念:

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 }

我能不能选择第二种方法,因为它更简洁、简单,而且可能更节省内存?


1
你在编辑之前的问题更有意义--因为在你的编辑中,array被定义为[String],所以它不能是nil,如果是的话,array.last将会失败而不是array?.last。最好还是回到原来的问题。 - jnpdx
请发布您的实际代码。array != nil ??? last 是可选的,但是您的 array 不是。 - Leo Dabus
guard foo != nil else { return } 在你不想使用 foo 的值,但工作流程的修改仍然依赖于其状态被设置的情况下非常有用。 - MadProgrammer
1个回答

7

在你的第一个示例中,foo 变成了一个非 Optional 类型。 因此,你可以这样做:

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

没有使用可选绑定的情况下,你仍然会有一个Optional。
guard foo != nil else { return }
foo?.doMethod()

有很多时候,拥有一个非Optional值更容易处理,包括能够避免使用!进行强制解包,所以第一个代码示例是很实用的。

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


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

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

你说得对,这种方式更加简洁。但是你所猜测的它在"内存效率"方面更高是极其不太可能的,因为编译器很可能会优化掉临时的可选绑定。

1
非可选类型的本地绑定foo相比仅检查!= nil还有另一个好处:如果foo引用了一个可选属性,即使在guard通过后该属性被赋值为nil,由于每次访问都会查找foo的值,这可能会导致意外行为;而使用本地绑定,即使属性更改,您的本地变量也不会更改。 - Itai Ferber
是的 - 很好的添加! - jnpdx
我的观点是,“if let”概念在几乎所有可能的情况下都被默认使用,即使你百分之百确定不会有任何意外行为。 - netsplatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接