Swift 可选链
可选链是一种用于调用属性、方法和下标的过程,这些属性、方法和下标可能当前为nil。如果可选项有值,则属性、方法或下标调用成功;如果可选项为nil,则属性、方法或下标调用返回nil。
您可以将多个查询链接在一起,但如果链中的任何部分为nil,则整个链条将失败。
可选链作为强制解包的替代方案
通过在调用属性、方法或下标的可选值后面放置一个问号(?),可以指定可选链,如果可选项不为nil,则调用属性、方法或下标。
可选链 | 强制解包 |
---|---|
当可选项为nil时,可选链会失败。 | 当可选项为nil时,强制解包会触发运行时错误。 |
用?操作符放在可选值之后,调用属性、方法或下标。 | 用!操作符放在可选值之后,强制解包值,调用属性、方法或下标。 |
可选链的示例(在基类中未声明值的情况下)
可选链的结果与预期的返回值相同,但封装在可选类型中。这意味着通过可选链访问时,通常返回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
在这里, Exam 是一个类名,包含了 student 作为成员函数。子类被声明为 Toppers ,名字是一个成员函数,它被初始化为” Intelligent “。通过创建一个可选的实例”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