Posted on 

可选类型

使用可选类型(optionals)来处理值可能缺失的情况。可选类型表示两种可能: 或者有值, 你可以解析可选类型访问这个值, 或者根本没有值。

例子:

1
2
let str = “123
let num = Int(str)

这段代码将变量str转换为num。显然,转换可能失败。由于str包含无法被转化为Int类型的值,它返回一个可选类型Int(写作Int?),表示它可能包含Int值,也可能不包含值。

nil

当将上面例子中的str的值改为无法转换为Int类型的值,如abcd,打印结果,就会显示nilnil表示“没有值”,可以通过给可选变量赋值nil来表示它没有值:

1
2
var code: Int? = 200
code = nil

如果声明一个可选变量而没有赋值,它也会被自动设为nil

可选绑定

使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在 if 和 while 语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或者变量。

1
2
3
if let constantName = someOptional {
statements
}

隐式解析可选类型

有时候在程序架构中,第一次被赋值之后,可以确定一个可选类型总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。
这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。把想要用作可选的类型的后面的问号(String?)改成感叹号(String!)来声明一个隐式解析可选类型。与其在使用时把感叹号放在可选类型的名称的后面,你可以在定义它时,直接把感叹号放在可选类型的后面。

1
2
3
4
5
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要感叹号来获取值

let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // 不需要感叹号