微信号:learnSwift

介绍:每天推送一篇精品Swift文章,无偿翻译,共同学习.;;

[swift]亲爱的 Erica,请帮我 guard 变量的值为空的情况

2016-08-19 21:26 Erica Sadun

译者:粉红星云;校对:aaaron7;定稿:千叶知风

你好,
我想知道针对下面这个在 Swift 中出现的特定情况是否有更优雅的解决方法 — 假设你想要在继续执行后续的代码前,检测一个特定的变量是否为空;通常是会做相反的事情(检测变量是否为有值)。我一般是这么写的:

guard thing == nil else {
   if let thing = thing {
      doSomething(withThing: thing)
    }
   return
}

有没有一个更好的方式来实现呢?我是可以使用 if 语句,但是我喜欢 guard 语句确保验证不通过不执行下面代码。逻辑上如果强制解包也可以,但是。。。(耸肩)

— Rob

你好,Rob,的确是有简单的多的方法。你用了 if 语句的使用方式套在 guard 中,这样也违背了这个语法的本意 — 使用 guard 来解包 “thing” 这个变量,失败了就不再执行下面的内容。如果你的 guard 语句的 “else” 下的大括号内容,显著地比一两行要多得多,那你应该是用错了这个语法了。

下面是正确的使用方式:

guard let thing = thing else { return } // 在变量不能被解包的时候退出
doSomething(with: thing) // thing 这个变量现在已经解包了

这个代码遵循了Swift一个常见的模式:使用 guard 映射一个可选变量的值。用guard 映射变量让你可以在当前代码块使用相同的变量名( “thing” )。在通过了 guard 语句的时候,你的变量已经解包了,可以直接使用,不用再检验其值不为nil。

避免强制解包是对的。给自己一个挑战,来确保你代码中的每一个 “!” 都是可行的。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg

 
SwiftGG翻译组 更多文章 推荐给菜鸟的编程书 Swift:如何优雅地使用 print()(二) iOS 与 OSX 内存管理:引用计数 Swift:如何优雅地使用 print()(三) 为 Swift 的协议实现 Equatable
猜您喜欢 手把手教你搭建安卓自动化框架之UIAutomator 城市里的田园梦 前端开发基础-JavaScript(四) 可伸缩 Web 架构与分布式系统(1) 关于工程师培训