📜  Swift可选链

📅  最后修改于: 2021-01-11 08:06:35             🧑  作者: Mango

Swift可选链

可选链接是一种过程,用于在当前可能为零的可选选项上调用属性,方法和下标。如果可选参数具有值,则属性,方法或下标调用成功;如果可选参数为nil,则属性,方法或下标调用返回nil。

您可以将多个查询链接在一起,但是如果链接中的任何链为nil,则整个链都会失败。

可选链接作为强制展开选项

通过在可选值之后放置问号(?)来指定可选链接,如果可选值不为nil,则在调用该属性,方法或下标时在该可选值之后放置一个问号(?)。

Optional Chaining Forced Unwrapping
Optional chaining fails when the optional is nil. Forced unwrapping triggers a runtime error when the optional is nil.
The operator ? is placed after the optional value to call property, method or subscript ! is placed after the optional value to call property, method or subscript to force unwrapping of value.

可选的链接示例(在基类中没有声明值)

可选链接的结果与期望的返回值相同,但包装在可选中。这意味着通常返回Int的属性将返回Int?通过可选链访问时。

让我们来看一个示例,以了解可选链接和强制替代之间的区别:

使用?的可选链接程序操作员

class Exam {
   var student: Toppers?
}
class Toppers {
   var name = "Intelligent"
}
let stud = Exam()
if let studname = stud.student?.name {
   print("Student name is \(studname)")
} else {
   print("Student name cannot be retrieved")
}

输出:

Student name cannot be retrieved 

在这里,考试是一个班级名称,其中包含学生作为成员函数。子类声明为Toppers ,名称为成员函数,其初始化为“智能”。通过创建带有可选“?”的实例“ stud”来初始化对超类的调用。

由于该值未在基类中声明,因此nil由else处理程序块存储和显示。

可选链接和访问属性的模型类

当您必须将多个子类声明为模型类时,可以使用它。它可以帮助您定义复杂的模型以及访问方法,属性,下标,子属性。

class rectangle {
   var print: circle?
}
class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      print("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}
class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}
class circumference {
   var circumName: String?
   var circumNumber: String?
   var street: String?
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}
let rectname = rectangle()
if let rectarea = rectname.print?.cprint {
   print("Area of rectangle is \(rectarea)")
} else {
   print("Rectangle Area is not specified")
}

输出:

Rectangle Area is not specified