1、可选类型概念
可选类型
用来处理值可能缺失的情况。
下面的例子尝试将一个String
转换成Int
:
let possibleNumber = "123
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推测为类型"Int?"
可以给可选变量赋值为nil
来表示它没有值:
var serverResponseCode: Int? = 404
serverResponseCode = nil
注意:
nil
不能用于非可选的常量和变量。如果代码中有常量或者变量需要处理值缺失的情况,应该声明称对应的可选类型。
如果声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil
:
var surveyAnswer: String?
// surveyAnswer 被自动设置为nil
可选类型可以用 ??
设置默认值:
var s: String?
var s1 = s ?? "xx"
print(s1) // print "xx"
注意:
Swift中的nil
和Objective-C中的nil
不一样。在OC中,nil
是一个指向不存在对象的指针。在Swift中,nil
不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为nil
,不只是对象类型。
2、强制解析
当你确定可选类型确实包含值之后,可以在可选的名字后面加一个感叹号(!
)来强制解析获取值。
if convertedNumber != nil {
print("convertedNumber has an integer value of \(convertedNumber).")
}
3、可选绑定
if let actualNumber = Int(possibleNumber) {
print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
print("\'\(possibleNumber)\' could not be converted to an integer")
}
// 输出 "'123' has an integer value of 123"
如果Int(possibleNumber)
返回的可选Int
包含一个值,创建一个叫做actualNumber
的新常量并将可选包含的值赋给它。
4、隐式解析可选类型
有时候一个可选类型第一次被赋值后,可以确定它总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的。
这种类型的可选状态被定义为隐式解析可选类型。把想要用作可选类型的后面的问号(String?
)改成感叹号(String!
)来声明一个隐式解析可选类型。
隐式解析可选类型主要被用在Swift中类的构造过程中,请自行查阅相关资料。
下面的例子展示了可选类型和隐式解析可选类型之间的却别:
let possibleString: String? = "An optional string."
let forcedString: String = possibleString!
// 需要感叹号来获取值
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString
// 不需要感叹号
注意:
如果一个变量之后可能变成nil
的话不要使用隐式解析可选类型。如果需要在变量的声明周期中判断是否是nil
的话,使用普通可选类型。
5. 可选类型的链式取值
传统写法:
var display: UILabel?
if let temp1 = display {
if let temp2 = temp1.text {
let x = temp2.hashValue
...
}
}
链式写法:
if let x = display?.text?.hashValue {...} // x is an Int
let x = display?.text?.hashValue {...} // x is an Int