可选链式调用

可选链式调用是一种可以在当前值可能为nil的可选值上请求和调用属性、方法及下标的方法。如果可选值有值,那么调用就会成功;如果可选值是nil,那么调用将返回nil。多个调用可以连接在一起形成一个调用链,如果其中任何一个节点为nil,整个调用链都会失败,即返回nil。


import UIKit

var str = "Hello, playground"

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

}

}

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

}

}

}

let john = Person()

//john.residence = Residence()

func createAddress() -> Address {

print("Function was called.")

let someAddress = Address()

someAddress.buildingNumber = "29"

someAddress.street = "Acacia Road"

return someAddress

}

john.residence?.address = createAddress()

let someAddress = Address()

someAddress.buildingNumber = "29"

someAddress.street = "Acacia Road"

let johnsHouse = Residence()

johnsHouse.rooms.append(Room(name: "Living Room"))

johnsHouse.rooms.append(Room(name: "Kitchen"))

john.residence = johnsHouse

//可选链访问属性

if let roomCount = john.residence?.numberOfRooms {

print("John's residence has \(roomCount) rooms")

}else {

print("Unable to retrive the number of rooms")

}

if (john.residence?.address = someAddress) != nil {

print("It was possible to set the address")

} else {

print("It was not possible to set addresss")

}

//可选链调用方法

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")

}

//可选链访问下标

if let firstRoomName = john.residence?[0].name  {

print("The first rooom name is \(firstRoomName)")

} else {

print("Unable to retrieve the first room name.")

}

var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]

testScores["Dave"]?[0] = 91

testScores["Bev"]?[0] += 1

testScores["Brian"]?[0] = 72

print("test1:\(testScores["Dave"])")

print("test2:\(testScores["Bev"])")

print("test3:\(testScores["Brian"])")

if let buildingIdentifier = john.residence?.address?.buildingIdentifier() {

print("John's building identifier is \(buildingIdentifier)")

}

if let beginWithThe = john.residence?.address?.buildingIdentifier()?.hasPrefix("The") {

if beginWithThe {

print("John's building identifier begin with \"The\" .")

} else {

print("John's building identifier does not begin with \"The\". ")

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 可选链(Optional Chaining)是一种可以请求和调用属性、方法和子脚本的过程,用于请求或调用的目标可能...
    零度_不结冰阅读 2,372评论 0 0
  • 126.析构器 在一个类实例销毁前,一个析构器会立即调用。使用deinit 关键字来表示析构器, 跟构造器写法类似...
    无沣阅读 4,262评论 0 4
  • 1、可选链式调用:通过点语法调用属性、方法、下标 // 可选链式调用可以在当前值为nil的情况下调用属性,方法,下...
    克鲁德李阅读 1,690评论 0 0
  • 可选链式调用 是一种可以在当前值可能为 nil 的可选值上请求和调用属性、方法及下标的方法。如果可选值有值,那么调...
    莽原奔马668阅读 2,656评论 0 2
  • photophobia [医 ] 畏光,羞明 按照现代译法也可以说是“照片恐惧症” 优秀的人每天都在诞生 新兴的 ...
    卢嘉敏阅读 1,787评论 0 1