可选类型optional type

28 阅读2分钟

可选类型表示一个变量可能有值,也可能没有值。
通过在类型后边加上'?'来表示

let possibleNumber = "123"

let convertedNumber = Int(possibleNumber)

上边代码中convertedNumber就是optional Int 而不是Int. 因为我们有些字符串可以用Int()进行转换,有些就不行。

如果设置了一个可选变量,但是没有提供初始值,那么这个变量默认值自动转变为nil.

var surveyAnswer: String? 
// surveyAnswer自动设置为nil

处理可选变量:当出现可选值时,我们需要对它进行是nil和不是nil的处理。有以下几种方法:

  1. 可选值绑定optional binding 可选值绑定就是,判断可选值是否为nil,如果不是,就将它赋值给一个临时的变量或者常量。可以通过if, guard, while等控制语句进行检查
let possibleNumber = "123"
if let actualNumber = Int(possibleNumber) {
    print("The string \(possibleNumber) has an integer of \(actualNumber")
} else {
    print("The string can't be converted to an integer")
}

在if语句中,使用可选绑定创建的变量和常量只能在if语句内使用。离开了if语句,这些变量或者常量就会再次变为可选值。 2. 提供一个回退值。nil-coalescing运算符??可以用来解包一个可选值。结构如下

optinalValue ?? defaultValue

如果optional 为nil,则使用defaultValue, 否则使用optionalValue解包后的值。

let name: String? = "Alice"

let greeting = "Hello, " + (name ?? "friend") + "!" //因为可选值name = :“Alice”, 所以使用解包后的值Alice

print(greeting) //Hello, Alice!
let name: String? = nil

let greeting = "Hello, " + (name ?? "friend") + "!" //因为可选值name值为nil,所以使用??后边的值“friend”

print(greeting) //Hello, friend!
  1. 强制解包

当nil代表了一个无法修复的错误,可以在可选值后边加上一个!,此时,如果可选值不为nil,那么结果就是解包后的值,如果为nil那么就会引发一个运行错误。