本文由NikoXu (iOS 爱好者) 翻译
Swift Optionals:什么是Optional ?
Swift Optionals:何时使用'!'和'?' ?
Swift Optionals:何时使用'if-let' ?
Swift Optionals:何时使用'as?'和'as' ?
何时使用'if-let'##
if-let是swift语言里的一种特殊的结构体(special structure),它允许检查一个Optional类型所持有的值并且对它解包后执行相应代码。让我们看看下面的代码:
if let nav = controller.navigationController {
nav.pushViewController(myViewController, animated: true)
} else {
//show an alert ot something else
}
if-let的结构体解包了controller.navigationController(编译器检测到这里被储存了值就会使用这个值)然后把它的值存到nav常量里。于是你可以在if的第一个分支里面使用nav。要注意的是在if语句里面,你再也不需要?或!。能意识到nav实际上是一个UINavigationController类型而不是一个可选型(Optional type)非常的重要,这样你可以直接使用它的值(If you remember in contrast the navigationController’s original type is UINavigationController?)。
if-let在另一种情形下是非常有用的。想象一下用你的navigationController代替单个方法调用你想做的东西。如果你不使用if-let你的代码将是这样的:
controller.navigationController?.hidesBarsOnSwipe = true
controller.navigationController?.hidesBarsOnTap = true
controller.navigationController?.navigationBarHidden = false
controller.navigationController?.popToRootViewControllerAnimated(true)
虽然这样你的代码是可以按预期来运作,但是你需要解包(unwrap)四次并且你的代码变得是非累赘。然而一旦使用if-let解包了对象,你的代码将变得更清晰漂亮和快捷:
if let nav = controller.navigationController {
nav.hidesBarsOnSwipe = true
nav.hidesBarsOnTap = true
nav.navigationBarHidden = false
nav.popToRootViewControllerAnimated(true)
}
是不是更加优雅了?
小贴士
nav在上述的例子中是以常量存在的。你可以用它来对它的属性进行修改,用它调用你需要的方法,但是你不能修改nav。值得注意的是你可以简单的用if var实现这样的功能。效果是一样的,但是你可以用一个解包的变量(unwrapped variable)来代替解包的常量(unwrapped constant),这样一来你可以按你的想法来改变它的值。
关于最后一种我想讲到的情形是使用Optional数据类型的类型转换(type casting)。请阅读Swift Optionals:何时使用'as?'和'as' ?
如何使用Optionals请阅读##
Swift Optionals:什么是Optional ?
Swift Optionals:何时使用'!'和'?' ?
Swift Optionals:何时使用'if-let' ?
Swift Optionals:何时使用'as?'和'as' ?
翻译菌: 因为是分次翻译的,所以把原文分成4个较小的篇幅来翻译的。在学习Swift的路途上,如有不妥,望指正。
网友评论