使用可选类型(optionals)来处理 值可能缺失 的情况。 可选类型表示两种可能:
或者有值,可以解析可选类型访问这个值
或者根本没有值,可以给可选变量赋值为nil来表示它没有值
nil
nil不能用于非可选的常量和变量
如果声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil:
var survey: String?
//survey 被自动设置为nil
在Objectivw-C中,nil是一个指向不存在对象的指针,在swift中,nil不是指针,它是一个确定的值,用来表示值缺失。
任何类型的可选状态都可以被设置为nil,不只是对象类型
if语句以及强制解析
可以使用if语句和nil比较来判断一个可选值是否包含值。可以使用“相等”(==)或者“不等”(!=)来执行比较
如果可选类型有值,它将不等于nil
let poss = "123"
var converted = Int(poss)
//converted 被推测为类型“Int?”,或者类型“optional Int”
if converted != nil{
print("converted is not nil")
}
//输出 "converted is not nil"
当你确定可选类型确定包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值,这被称为可选值的强制解析
⚠️:使用!来获取一个不存在的可选值会导致允许的错误。
强制解析之前,一定确定可选包含一个非nil的值
if converted != nil {
print("converted has a value is \(converted!)")
}
//输出 "converted has a value is 123"
可选绑定
使用可选绑定(optional binding)来判断可选类型是否包含值
如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在if和while语句中:
let possibleNumber = "123"
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”
let possibleNumber = "String"
if let actualNumber = Int(possibleNumber) {
print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
print("\'\(possibleNumber)\' could not be converted to an integer")
}
//输出 'String' could not be converted to an integer
你可以包含多个可选绑定或多个布尔条件在一个 if
语句中,只要使用逗号分开就行。只要有任意一个可选绑定的值为 nil
,或者任意一个布尔条件为 false
,则整个 if
条件判断为 false
。下面的两个 if
语句是等价的:
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
// 输出“4 < 42 < 100”
if let firstNumber = Int("4") {
if let secondNumber = Int("42") {
if firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
}
}
// 输出“4 < 42 < 100”