! 使用感叹号(!)可选链实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 class Person { var residence: Residence ? } class Residence { var numberOfRooms = 1 } let john = Person () let roomCount = john.residence! .numberOfRooms
想使用感叹号(!)强制解析获得这个人residence属性numberOfRooms属性值,将会引发运行时错误,因为这时没有可以供解析的residence值。
? 使用问号(?)可选链实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Person { var residence: Residence ? } class Residence { var numberOfRooms = 1 } let john = Person () if let roomCount = john.residence? .numberOfRooms { print ("John 的房间号为 \(roomCount) 。" ) } else { print ("不能查看房间号" ) }
连接多层链接 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 class Person { var residence: Residence ? } class Residence { var rooms = [Room ]() var numberOfRooms: Int { return rooms.count } subscript (i : Int ) -> Room { return rooms[i] } func printNumberOfRooms () { print ("房间号为 \(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 ) { return buildingNumber } else { return nil } } } let john = Person () if let johnsStreet = john.residence? .address? .street { print ("John 的地址为 \(johnsStreet) ." ) } else { print ("不能检索地址" ) }
对返回可选值的函数进行链接 我们还可以通过可选链接来调用返回可空值的方法,并且可以继续对可选值进行链接。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 class Person { var residence: Residence ? } class Residence { var rooms = [Room ]() var numberOfRooms: Int { return rooms.count } subscript (i : Int ) -> Room { return rooms[i] } func printNumberOfRooms () { print ("房间号为 \(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 ) { return buildingNumber } else { return nil } } } let john = Person () if john.residence? .printNumberOfRooms() != nil { print ("指定了房间号)" ) } else { print ("未指定房间号" ) }
上例中,对Residence的函数printNumberOfRooms进行链接。