你可能还记得,本章前面对String变量使用了方法toInt()来将其内容转换为Int值,以便将结果赋给另一个变量: 17> var myConvertedInt = s.toInt() myConvertedInt: Int? = 123 18> 在Swift显示的类型说明中,有一个问号。这个问号表明变量myConvertedInt的类型不是Int,而是可选为Int类型。 可选是什么意思呢?它实际上是一个类型修饰符,告诉Swift指定的变量或常量可以为空。空值很久前就出现在了编程语言中;在Objective-C中用nil表示,而在C/C++中用NULL表示。nil和NULL的含义完全相同,都表示空值。 来看看在另一种情形下(s不为"123",而是"abc")上述代码的运行结果: 71> let s = "abc" s: String = "abc" 72> var myConvertedInt = s.toInt() myConvertedInt: Int? = nil 73> 注意到myConvertedInt的类型依然是Int?(可选Int),但其值不再是123,而是nil。这是对的,因为无法将字母abc转换为Int。Swift通过返回nil来指出转换失败,而可选类型提供了另一条成功地给变量赋值的路径。在这里,String类的方法toInt()返回nil,指出我无法将这个字符串转换为数字。 将变量声明为可选类型很简单,只需在声明时在类型名后面加上一个问号: 73> var v : Int? v: Int? = nil 74> Swift的应答表明,变量v的类型确实是可选Int。由于声明时没有赋值,因此默认值不是0,而是nil。 下面尝试给这个变量赋值: 74> v = 3 75> 最后,显示这个变量的值:不使用方法println,而只是输入变量名。Swift将把它的值赋给一个临时变量: 75> v $R10: Int? = 3 76> 正如你看到的,Swift指出这个变量的值确实是3。 并非只有Int类型可以是可选的。事实上,任何类型都可声明为可选的。下面的示例声明了两个可选变量,它们的类型分别为String和Character: 76> var s : String? = "Valid text" s: String? = "Valid text" 77> var u : Character? = "a" u: Character? = "a" 78> u = nil 79> 第78行将变量u的值设置成了nil,旨在表明任何被声明为可选的变量都可设置为nil。 本书后面将更详细地探讨可选类型,就目前而言,你只需能够识别可选变量就够了。