首页 > 代码库 > Welcome to Swift (苹果官方Swift文档初译与注解十二)---77~83页(第二章)
Welcome to Swift (苹果官方Swift文档初译与注解十二)---77~83页(第二章)
Optionals (可选类型)
当一个值可能有值,也可能没有值,这种情况你可以使用可选类型.可选类型的意思是:
有个一个值,它等于x,或者,根本没有任何值.
注意点:
可选类型的概念在C和OC中都是没有的.在OC中最相似的情况是,一个方法返回nil或者返回一个对象.OC中返回nil意思是没有合法的对象.然而,这只能针对对象,不能用在结构体,基本 数据类型,或者枚举值.对于这些类型,OC的方法只能返回固定的某个值(比如NSNotFound)来提示没有某个值.这要去方法的调用者清楚的记得返回的固定值来进行测试和检查.在Swift 中,可选类型可以用于任何类型的值,不再需要固定的常量.
例如,在Swift中String类型有一个叫做toInt的方法,它将一个String值转换成Int值,然而不是每个String类型值都可以转换成Int值.String类型的”123”可以被转换成Int类型的123,但 是String类型的”hello,world”却不能转成任何Int类型的值.
下面的代码使用toInt方法试图将一个Sting类型转换为Int:
let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()
// convertedNumber is inferred to be of type "Int?", or "optional Int”
由于toInt方法可能失败,它返回一个可选类型Int而不是整型Int.可选类型Int写法是Int?,而不是Int.问号?表示它是可选类型值,这意味着,它可能有某些Int类型的值,或者它根本没有任何 值(它也不能包含其他别的类型值,比如布尔值或者String值,它要么是一个Int,要么什么都没有.)
If Statements and Forced Unwrapping (if语句和强制解包)
可以使用if语句来确认可选类型是否有值.如果一个可选类型有值,它等价true,如果它没有值,等价false.
一旦确定可选类型有值,可以通过在可选类型名的后面添加一个感叹号(!)来访问内部的值,感叹号的含义是:”我知道这个可选类型有一个值,请使用这个值”.这就是所谓可选类型值的 强制解包.
if convertedNumber {
println("\(possibleNumber) has an integer value of \(convertedNumber!)")
} else {
println("\(possibleNumber) could not be converted to an integer")
}
// prints "123 has an integer value of 123”
关于更多的if语句,请参考流程控制(Control Flow).
注意点:
试图使用感叹号(!)访问一个没有值的可选类型将触发运行时的错误.在使用强制解包可选类型是,一定要确认它是有值的.
Optional Binding (可选绑定)
使用可选绑定可以判断一个可选类型是否包含值,并会生成一个临时的常量或者变量保存这个值.可选绑定常常与if和while语句一起来检测可选类型包含的值.
可以像下面的代码一样,使用可选绑定在if语句中:
if let constantName = someOptional {
statements
}
在下面的代码中,你也可以使用可选绑定来重写possibleNumber例子,而不使用强制解包:
if let actualNumber = possibleNumber.toInt() {
println("\(possibleNumber) has an integer value of \(actualNumber)")
} else {
println("\(possibleNumber) could not be converted to an integer")
}
// prints "123 has an integer value of 123”
上面代码可以理解为:
“如果possibleNumber.toInt返回的Int可选类型包含一个值,那么将这个值赋值给叫做actualNumber的常量”
如果条件成立,在if语句的第一个分支语句中常量actualNumber就会有值,这个值正是包含在可选类型内的值,并且用它初始化了常量actualNumber.因此不再需要使用感叹号!后最来 访问这个值.在上面的代码样例中,actualNumber只是用来打印输出这个结果.
可选绑定可以用常量也可以用变量.如果你想在if的第一个分支语句中操作actualNumber的值,你可以用if var actualNumber 来替代,这样包含在可选类型中的值,将会赋值给变量而不 是常量.