Swift 可选链


Swift 可选链

Swift 可选链是一种特殊语法,用于处理可选类型的属性和方法。它允许你在使用可选类型时,避免了繁琐的 nil 检查和强制拆包操作,从而简化了代码。

可选类型

首先要理解什么是可选类型。在 Swift 中,我们有两种类型: 非可选类型可选类型

非可选类型表示这个值必定存在,如果创建之后不给值,则编译器会进行错误提示;

var age: Int = 18     //非可选类型,必定存在,且一开始赋值,之后依旧可以更改。

而对于可选类型,仅表示这个值存在与否,不存在时为 nil,所以创建可选类型时默认是空值nil的。

var phone: String?    //创建一个可选类型的字符串变量,其初始值默认为 nil

问号

在 Swift 中,问号 ? 是一个重要的语法符号,它代表可选类型的变量或常量。

例如:

let message: Int? = 123  // 可选类型的整数变量,其值为 123
let name: String? = "Swift"// 可选类型的字符串变量,其值为 Swift

运算符 ! 代表解包,但是它有时效性和安全性问题,因此 Swift 推出了强制解包可选链

强制解包

在 Swift 中,使用 ! 运算符来对可选类型进行强制解包。它会将可选类型中的值强制展开并解包,返回一个非可选类型的值。通过这种方式,让我们能够方便地使用可选类型的值,但请注意使用时,变量不为空,否则强制转换时异常。

let str: String? = "hello"
let forceStr = str! // 输出为 "hello"

当可选类型中的值为空时,我们对其进行强制解包调用会导致运行时错误,因此需要避免这种行为。好的做法是在强制解包之前先进行判断:

if str != nil {
    let forceStr = str! // 解包非空的可选类型值
} else {
    print("str is nil")
}

可选链

可选链就是在访问可能 nil 的可选类型值时,我们不用强制解包进行访问或调用,而是使用问号 ? 来进行调用。

用于处理可选类型的属性、方法、下标,一个返回值也可能是可选类型。

例如:

class Parent {
    var child: Child?
}

class Child {
    var name: String?
}

let parent = Parent()
let name = parent.child?.name

上述的例子就涉及了多级可选链:先访问 parentchild 属性,然后访问 childname 属性。如果 child 为空,则 name 也会被置为 nil

也可以使用可选链来调用方法和下标:

let str: String? = "hello"
let count = str?.count  // count 为 Int? 类型

此时 count 是一个可选类型的整数。如果 str 为 nil,则 count 也会被置为 nil

可选链连续调用:

class Parent {
    var children: [Child]?
}

class Child {
    var name: String?
    var age: Int?
}

let parent = Parent()
let age = parent.children?.first?.age

在这个例子中,我们通过可选链调用 parentchildren 属性,接着调用数组的 first 属性,最后再调用 first 对象的 age 属性。如果 children 为空数组、first 是 nil、或者 age 值不存在,则 age 就会被置为 nil。

除了使用问号 ? 之外,我们还可以使用双问号 ?? 运算符给可选对象设置一个默认值:

let age = parent.children?.first?.age ?? 0

在这个例子中,如果可选链调用之后返回 nil,则将默认值 0 赋值给 age

总结

可选类型和可选链是 Swift 中非常重要的特性,它们可以帮助我们更好地处理可选类型的值,避免出现强制解包时的运行时错误。当我们需要操作可选类型的值时,请务必使用可选链,这是一种比较保险、易于维护的方式。特别是在编写复杂的嵌套结构和调用连锁的情况下,可选链显得尤为重要。