美文网首页
swift 可选链式调用

swift 可选链式调用

作者: 皆为序幕_ | 来源:发表于2019-05-08 17:17 被阅读0次
  • 可选链式调用是指在当前值可能为ni的情况下,用当前值去获取它的属性、方法及其下标
    如果可选值有值,调用就会成功
    如果可选值是nil,调用将返回nil
  • 多个调用可以连接在一起形成一个调用链,如果其中任何一个节点为nil,整个调用链都会失败,即返回nil。

使用可选链式调用代替强制解包

class Student {
    var hobby: Hobby?
}
class Hobby {
    var run = "run"
}

//创建了一个新的Student实例,它的hobby属性由于是是可选型而将初始化为nil
let stu = Student()

//如果使用叹号`!`强制展开获得这个stu的hobby属性中的run值,会触发运行时错误,因为这时run没有可以展开的值
let hobby = stu.hobby!.run //运行时错误

//stu.hobby为非nil值的时候,上面的调用会成功,并且把run设置为String类型
let hobby =stu.hobby?. run //无报错

通过一个简单模型来示例可选链的使用(可选链式调用访问属性、可选链式调用调用方法、可选链式调用访问下标等等)

class Person {
    var residence: Residence?
}

class Residence {
    var rooms = [Room]()
    var numberOfRooms: Int {
        return rooms.count
    }
    subscript(i: Int) -> Room {
        get {
            return rooms[i]
        }
        set {
            rooms[i] = newValue
        }
    }

    //此方法未指定返回类型,没有返回类型的函数和方法具有隐式返回类型Void,返回值可以是()或空元组。
    func printNumberOfRooms() {
        print("The number of rooms is \(numberOfRooms)")
    }
    var address: Address?
}

class Room {
    let name: String
    init(name: String) { self.name = name }
}

class Address {
    var buildingName: String?
    var buildingNumber: String?
    var street: String?
    func buildingIdentifier() -> String? {
        if buildingName != nil {
            return buildingName
        } else if buildingNumber != nil && street != nil {
            return "\(buildingNumber) \(street)"
        } else {
            return nil
        }
    }
}
通过可选链式调用访问属性

读取属性
由于john.residence是nil,这种可选链式调用会失败

let john = Person()
if let roomCount = john.residence?.numberOfRooms {
    print("John's residence has \(roomCount) room(s).")
} else {
    print("Unable to retrieve the number of rooms.")
}
//Unable to retrieve the number of rooms.

设置属性
通过john.residence来设定address属性也会失败,因为john.residence当前为nil

let someAddress = Address()
someAddress.buildingNumber = "29"
someAddress.street = "Acacia Road"
john.residence?.address = someAddress
通过可选链式调用调用方法
  • 可以通过可选链式调用来调用方法,并判断是否调用成功,即使这个方法没有返回值
  • 如果在可选值上通过可选链式调用来调用这个方法,该方法的返回类型会是Void?,而不是Void,因为通过可选链式调用得到的返回值都是可选的
let john = Person()
if john.residence?.printNumberOfRooms() != nil {
    print("It was possible to print the number of rooms.")
} else {
    print("It was not possible to print the number of rooms.")
}
//It was not possible to print the number of rooms.
通过可选链式调用访问下标
  • 通过可选链式调用,可以在一个可选值上访问下标,并且判断下标调用是否成功
    注:通过可选链式调用访问可选值的下标时,应该将问号放在下标方括号的前面而不是后面,可选链式调用的问号一般直接跟在可选表达式的后面
  • 用下标访问john.residence属性存储的Residence实例的rooms数组中的第一个房间的名称,因为john.residence为nil,所以下标调用失败
let john = Person()
if let firstRoomName = john.residence?[0].name {
    print("The first room name is \(firstRoomName).")
} else {
    print("Unable to retrieve the first room name.")
}
//Unable to retrieve the first room name.

连接多层可选链式调用

  • 如果你访问的值不是可选的,可选链式调用将会返回可选值(可选链式调用访问一个Int值,将会返回Int?)
  • 如果你访问的值就是可选的,可选链式调用不会让可选返回值变得“更可选”(可选链式调用访问Int?值,依旧会返回Int?值,并不会返回Int??)

相关文章

  • swift重温笔记(可选链式调用)

    使用可选链式调用代替强制展开 为可选链式调用定义模型类 通过可选链式调用访问属性 通过可选链式调用调用方法 通过可...

  • swift 可选链式调用

    可选链式调用是指在当前值可能为ni的情况下,用当前值去获取它的属性、方法及其下标如果可选值有值,调用就会成功如果可...

  • Swift - 可选链式调用

    可选链式调用是一种可以在当前值可能为nil的可选值上请求和调用属性、方法及下标的方法。如果可选值有值,那么调用就会...

  • Swift可选链式调用

    可选链式调用是一种可以在当前值可能为nil的可选值上请求和调用属性、方法及下标的方法。如果可选值有值,那么调用就会...

  • swift基础—可选链式调用

    可选链式调用 是一种可以在当前值可能为 nil 的可选值上请求和调用属性、方法及下标的方法。如果可选值有值,那么调...

  • Swift-可选链式调用

    概念 所谓可选链式调用就如同其名称那样可以看成一个个链环联接在一起的链条。每个链节就是一个获得可选值的调用(包括通...

  • swift-可选链式调用

  • swift-可选链式调用

    结论: 如果你访问的值不是可选的,可选链式调用将会返回可选值(eg: 可选链式调用访问一个String值,将会返回...

  • 可选链式调用

    可选链式调用(Optional Chaining)wiki 可选链式调用:是一种可以在当前值可能为nil的可选值请...

  • [iOS笔记]Swift中的可选链式调用的注意点

    通过可选链式调用访问属性 下面代码中的赋值过程是可选链式调用的一部分,这意味着可选链式调用失败时,等号右侧的代码不...

网友评论

      本文标题:swift 可选链式调用

      本文链接:https://www.haomeiwen.com/subject/pmilfqtx.html