swift远征~可选型
可选型(optional)是swift中一个非常重要的概念,它使这个语言变得更加安全,在编译时就能有效规避许多实例为空的错误。
在swift中,表示一个实例为空只有一种方式,就是nil,而一般情况下的实例是不能够被赋予nil的,除非将它定义为可选型
写法
var optionalStr : String? = nil
在数据类型后面加上一个?即表示该类型为可选型,因此我们可以在初始化的时候赋予nil。
强制解包(forced unwrapping)
由于swift是一种强类型语言,当可选型与非可选型运算或者赋值之前需要对可选型进行转化,即强制解包
var optionalStr : String? = nil
optionalStr = "optionalStr"
let str5 : String = optionalStr!
在可选型实例后面加上一个!即表示对它强制解包,此时它被认为是一个非空的实例,但此处需要我们确保它为非空,否则会出现为空的错误。
隐式强制解包的可选型
var optionalStr : String! = nil
optionalStr = "optionalStr"
let str5 : String = optionalStr
我们在使用这种可选型时不再需要每次都显式的使用解包符,但同样的,必须要由我们自己保证它是非空的,否则程序会出错。
可选型实例绑定(optional binding)
var optionalStr : String? = nil
optionalStr = "optionalStr"
if let str5 = optionalStr{
print(str5)
} else {
print("optionalStr is nil")
}
这是一种更加安全的解包方式,如果此时optionalStr为空,那么将不会进入if的代码块,因此无论如何也不会出现为空错误。可以在if后面绑定多个可选型实例,或是添加额外的判断条件,使用逗号分隔。
var optionalStr : String? = nil
var optionalStr1 : String? = nil
optionalStr = "optionalStr"
if let str5 = optionalStr, let str6 = optionalStr1{
print(str5+str6)
} else {
print("optionalStr or optionalStr1 is nil")
}
可选型的链式调用(optional chaining)
var optionalStr : String? = nil
optionalStr?.append("star")
在对可选型实例进行链式调用时,加上一个?,这样当实例不为空时才会继续向下调用,否则返回一个nil,因此这种链式调用的返回值也会是一个可选型。
此处也可以用!代替?,这种写法意味着无论可选型实例是否为空都会继续调用,因此并不推荐用这种写法。
nil合并运算符
var optionalStr : String? = nil
optionalStr?.append("star")
print(optionalStr ?? "optionalStr is nil") //"optionalStr is nil\n"
在可选型后使用??运算符,然后接一个值,代表在可选型实例为空时使用这个值。这也是一种解包方式,如果是在为空时只需要为实例赋一个默认值,那么这种写法是最简洁的。