Swift(五)可选类型

Swift(五)可选类型_第1张图片
911be00839cf94b804cc6dbc35fcb82959338ea555d54-LVDKX2_fw658.jpeg

Optional的定义

Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil。此外,Swift的nil也和Objective-C有些不一样,在Objective-C中,只有对象才能为nil,而在Swift里,当基础类型(整形、浮点、布尔等)没有值时,也是nil,而不是一个初始值,没有初始值的值,是不能使用的,这就产生了Optional类型。
Optional的值很容易,只需要在类型后面加上问号(?)就行了,如:

var str: String?

一个Optional值和非Optional值的区别就在于:Optional值未经初始化虽然为nil,但普通变量连nil都没有:

//未被初始化,但是是一个Optional类型,为nil
var str: String?
str //输出nil
//未被初始化,也不是Optional类型
var str2: String
str2    //使用时出错

注意:C 和 Objective-C 中没有可选这个概念。Objective-C 中的一个特性与可选比较类似:一个方法要么返回一个对象,要么返回 nil,nil 表示“缺少一个合法的对象”。

Optional的拆包

显式拆包

//声明时使用?来指定显示拆包, 拆包时使用!拆包
var n1: Int? = 10
print(n1) //Optional(10)\n
print(n1! + 100)        //显式拆包

隐式拆包

//声明时使用!来指定隐式拆包, 拆包时直接使用
var n2: Int! = 100
print(n2 + 200)         //隐式拆包

Optional类型的值不能被直接使用,当需要用时要显式拆包,以表明我知道这个Optional是一定有值的:
例如:Swift 的 String 类型有一个方法 toInt (Swift2.x),用于将一个 String 值转换成一个 Int 值。然而,不是所有的字符串都可以转换成一个整数。字符串 "123" 可以被转换成数字123,但是"hello, world"是不行的。

下面的例子调用 toInt 方法试图将一个 String 转换成 Int:

let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()//XCode8上测试发现有问题
let convertedNumber:Int? = Int(possibleNumber)//应该使用这个
// convertedNumber is inferred to be of type "Int?", or "optional Int"

因为 toInt 方法可能失败,所以它返回一个可选的(optional)Int,而不是一个Int。一个可选的 Int 表示为: Int? 。问号表示是可选的,也就是说可能包含 Int 值也可能不包含。(只能是 Int 或者什么都没有。不能包含其他值,比如 Bool值或者 String 值。)

你可能感兴趣的:(Swift(五)可选类型)