Swift 的可选链是一种安全而灵活的方式,用于调用和查询属性、方法以及下标脚本是否可以被成功调用,而无需检查调用前面的值是否为 nil。可选链的语法使用问号(?)来连接可能为 nil 的属性、方法或下标脚本。

以下是关于 Swift 可选链的一些基本操作:

1. 可选链调用属性
   class Person {
       var residence: Residence?
   }

   class Residence {
       var address: Address?
   }

   struct Address {
       var street: String
       var city: String
       var zipCode: String
   }

   let person = Person()
   let street = person.residence?.address?.street

   在上面的例子中,person 的 residence 和 residence 的 address 都是可选的。通过可选链,可以安全地访问 street 属性,即使 residence 或 address 为 nil。

2. 可选链调用方法
   class Person {
       var residence: Residence?

       func printStreet() {
           if let street = residence?.address?.street {
               print("Street: \(street)")
           } else {
               print("No street information available")
           }
       }
   }

   let person = Person()
   person.printStreet() // 输出 "No street information available"

   在上面的例子中,通过可选链调用了 printStreet 方法,该方法尝试访问 street 属性。如果链中任何一个值为 nil,则方法内部的代码块将被执行。

3. 可选链调用下标脚本
   class Person {
       var residences: [Residence] = []
   }

   class Residence {
       var rooms: [String: String] = [:]

       subscript(roomName: String) -> String? {
           return rooms[roomName]
       }
   }

   let person = Person()
   let roomName = "Living Room"
   let roomDescription = person.residences.first?[roomName] ?? "Room not found"

   在上面的例子中,通过可选链调用了 residences 数组的第一个元素的下标脚本。如果 residences 数组为空,或者第一个元素为 nil,则 roomDescription 将被设置为默认字符串。

4. 多层可选链
   class Person {
       var residence: Residence?
   }

   class Residence {
       var address: Address?
   }

   struct Address {
       var street: String
       var city: String
       var zipCode: String
   }

   let person = Person()
   let zipCode = person.residence?.address?.zipCode

   在上面的例子中,通过多层可选链访问了 zipCode 属性。如果 residence 为 nil,或者 address 为 nil,则 zipCode 将为 nil。

可选链允许在调用属性、方法或下标脚本时检查调用链中的任何一级是否为 nil,从而避免了在代码中插入大量的条件语句进行判空。


转载请注明出处:http://www.pingtaimeng.com/article/detail/6857/Swift