Swift 中的 Guard let foo = foo VS Guard foo != nil

Mik*_*oon 3 guard ios swift

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

guard let foo = foo else { return }
Run Code Online (Sandbox Code Playgroud)

guard foo != nil else { return }
Run Code Online (Sandbox Code Playgroud)

这些说法有什么区别?不使用后者的原因是什么?

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

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

guard let lastElement = array.last, lastElement == "corn" else { return false }
Run Code Online (Sandbox Code Playgroud)

并且不使用let:

guard array.last == "corn" else { return false }
Run Code Online (Sandbox Code Playgroud)

难道我不能采用第二种方法,因为它更干净、更简单,而且内存效率更高?

jn_*_*pdx 7

通过您的第一个示例,foo成为非可选。所以,你可以这样做:

guard let foo = foo else { return }
foo.doMethod()
Run Code Online (Sandbox Code Playgroud)

尽管没有可选绑定,您仍然有一个可选:

guard foo != nil else { return }
foo?.doMethod()
Run Code Online (Sandbox Code Playgroud)

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

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


在带有 type 数组的示例中[String],是的,您可以进行第二次比较,而无需可选绑定来检查是否存在元素last

guard array.last == "corn" else { return false }
Run Code Online (Sandbox Code Playgroud)

你是对的,这样更干净。不过,正如您推测的那样,它不太可能更加“内存有效”,因为编译器可能会优化掉临时可选绑定。