本文由NikoXu (iOS 爱好者) 翻译
Swift Optionals:什么是Optional ?
Swift Optionals:何时使用'!'和'?' ?
Swift Optionals:何时使用'if-let' ?
Swift Optionals:何时使用'as?'和'as' ?
关于作者:
Hi this is Marin - the author of Touch Code Magazine, I hope you are enjoying my tutorials and articles. Also if you need a bright iPhone developer overseas contact me - I do contract work. Here's my LinkedIn profile
似乎每个人都正在爱上Swift语言,但是自从swift的Optionals(本文翻译为可选型)逐渐被大家接受为一种有些超前的概念时,我看到网络上的流传的Swift代码似乎都是随机性地进行Optionals Unwrap(可选型的解包)操作。坦诚地说,我到现在还没有看到一篇精彩的blog能清晰明确的讲解我们应该在何时使用unwrap这种操作,是对我们使用swift高效进行开发是有帮助的。
什么是Optionals##
想象一下,有编写的旧数据类型正好是你正使用在Objective-C (or PHP, Javascript, etc.) 的代码。假设你有叫做age和height的两个变量,它们就是int这样可以保存任何整数的简单数据类型,让我们看看以下简单的代码:
var age: Int = 35
let height: Int = 180
你用关键字var声明了变量age并且赋值35,你也许在之后改变了想法,给age重新赋予另一个值,比如36,你甚至一而再再而三地给它赋值。换个角度说,height是一个常量,一旦你给它赋值了100,那么它就是100了。
然而在这类情况中,你一直知道Int类型只会包含一类值——那就是整数。那么你自然会对这个变量进行赋值——这个变量不能为nil.
举例来说,在一家公司员工信息的数据库里有这么一些数据,其中有一些数据可能没有记录员工的身高height。在这种情况下你不应该对这些员工的height属性赋值为0,而是什么也不做设置或者直接设置成缺省。
在上述的情况下,你期望有一个更为恰当的数据类型可以使用,那就是使用一种Optional的数据类型。
实际上Optional类型,很多学习swift的人还没有意识到,它就是一种用一些语法糖(Syntax Suger)定义在swift标准库顶端的枚举类型(Enumeration)。这个枚举类型看起来是这样的(缩写):
enum Optional : NilLiteralConvertible {
case None
case Some(T)
}
由此可见,Optional类型也可以包含** None。而当 Optional遵守NilLiteralConvertible时,你可以知道在像上面举例的那种情形下你可以使用** Optional值的nil来解决,而在其他的情形下, Optional**被定义成一个可以持有T类型的值,这里的T类型是任何你想要的类型(范型T)。
因此对于一个Optional<Int>,它既可以包含nil也可以包含Int类型。是不是听起来简单用起来也方便呢?那么就让我们把swift的语法糖用起来。定义一个既可以持有整数也可以持有nil的age和height变量:
var age: Int? = nil
var height: Int? = 180
通过添加一个' ? '标记便能立刻告诉编译器这个变量可能是一个数也可能不是。漂亮!注意:这样做对定义一个Optional的常量并没有意义。如果需要,你可以创建一次optional的值,然后你可以告诉编译器这些值可能为nil,也可能不为nil。
为了让大家清楚的明白在使用Optionals时到底发生了什么,让我们看看下面的场景例子里发生了什么。代码如下:
var height: Int? = 180
实际上等同于:
var height: Optional<Int> = Optional<Int>(180)
如果你一旦理解这里到底是怎么运作的,你会发现Optional的概念非常的简单,不是吗?你使用?符号添加数据类型后面的语意就是用类似上面的代码转换的语法糖一样。
就这样,我希望现在你已经对什么是Optional数据类型已经有了很好的认识。那么让我们来瞧瞧如何去准确的使用它们。
如何使用Optionals请阅读##
Swift Optionals:什么是Optional ?
Swift Optionals:何时使用'!'和'?' ?
Swift Optionals:何时使用'if-let' ?
Swift Optionals:何时使用'as?'和'as' ?
翻译菌: 因为是分次翻译的,所以把原文分成4个较小的篇幅来翻译的。在学习Swift的路途上,如有不妥,望指正。