Swift可选类型与可选绑定
所属分类:ios | 发布于 2022-12-04 21:14:23
Swift中使用可选类型(optional)来处理值可能缺失的情况。这部分的内容包含以下几个知识点。
- 可选类型基本概念
- nil
- if语句以及强制解包
- 可选绑定
- 隐式解析可选类型
可选类型基本概念
Swift中使用可选类型(optionals)来处理值可能缺失的情况。可选类型表示有两种可能:或者有值,你可以解析可选类型访问这个值,或者根本没有值。
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推断类型为Int?,或者类型"optional Int"
这个例子中,如果possible是123,convertedNumber就是有值,如果possibleNumber是hello,world,convertedNumber就是没有值。
因为该构造器可能会失败,所以它返回一个可选类型(optional) Int,而不是一个Int。一个可选的Int被写作Int?而不是Int。问号暗示包含的值是可选类型,也就是说可能包含Int值也可能不包含值。(不你包含其它任何值比如Bool值或者String值,只能是Int或者什么都没有)。
nil
可以给可选变量赋值为nil来表示它没有值:
var serverResponseCode: Int? = 404
// serverResponseCode 包含一个可选的Int值 404
serverResponseCode = nil
// serverResonponseCode 现在不包含值
nil不能用于非可选的类型和常量。如果你的代码中有常量或变量需要处理值缺失的情况,请把它们声明为对应的可选类型。
如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil:
var surveryAnswer: String?
// surveryAnswer 被自动设置为 nil
if语句以及强制解包
可以使用if语句和nil来比较判断一个可选值是否包含值,你可以使用相等==或者不等!=来执行比较。
如果可选值有值,它将不等于nil:
if convertedNumber != nil {
print("convertedNumber containes some integer value.")
}
当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个感叹号表示"我知道这个可选有值,请使用它"。这个过程被称为可选值的强制解包(forced unwrapping):
if convertedNumber != nil {
print("convertedNumber has an integer value of \(convertedNumber!).")
}
// 输出”convertedNumber has an integer value of 123.“
注意:使用!来获取一个不存在的可选值会导致运行时错误。使用!来强制解包值之前,一定要确定可选包含一个非nil的值。
可选绑定
使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时的变量或者常量。可选绑定可以用在if和while语句中,这条语句不仅可以用来判断可选类型中是否有值,同时可以将可选类型中的值赋给一个常量或变量。
在if语句中使用可选绑定语法
if let constantName = someOptional {
statements
}
使用可选绑定来重写在可选类型中举出的possibleNumber的例子:
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的新常量并将可选包含的值赋给它”。
如果转换成功,actualNumber常量可以在if语句的第一个分支中使用。它已经被可选类型包含的值初始化过,所以不需要再使用!后缀来获取它的值。
你可以包含多个可选绑定或多个布尔条件在一个if语句中,只要使用逗号分开就行。
另外一个示例:
if let movie = item as? Movie {
print("Movie: \(movie.name), dir. \(movie.director)")
}
可选绑定"if let movie = item as? Movie"可以这样解读:"尝试将item转为Movie类型。若成功,设置一个新的临时变量movie来存储返回的可选Movie中的值"。
隐式解析可选类型
对于可选类型,在程序架构中,第一次被赋值之后,可以根据一个可选类型总会有值。在这种情况下,每次都要判断和解析可选值是非常低效的,因为可以确定它总会有值。
这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionsl)。把需要用作可选类型的后面的问号(String?)改为感叹号(String!)来声明一个隐式解析可选类型。与其在使用时把感叹号放在可选类型的名称的后面,你可以在定义它时,直接把感叹号放在可选类型的后面。
隐式解析可选类型主要被用作Swift中类的构造过程中。
一个隐式解析可选类型就是一个普通的可选类型,但是可以被当做非可选类型来使用,并不需要每次都使用解析来获取可选值。下面的例子展示了可选类型String和隐式解析可选类型String之间的区别:
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! //需要感叹号来获取值
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: assumedString //不需要感叹号