swift基础day6---可选链

可选链式调用

可选链式调用可以应用于任意类型,并且能检查调用是否成功。

使用可选链式调用代替强制展开

可选链式调用的返回结果与原本的返回结果具有相同的类型,但是被包装成了一个可选值。(类似于:Int?)

//使用可选链式调用代替强制展开
class Person {
    var residence: Residence?   //如果使用!,residence没有值会出现运行错误
}

class Residence {
    var numberOfRooms = 1
}
let john = Person()
为可选链式调用定义模型类

通过使用可选链式调用可以调用多层属性、方法和下标。这样可以在复杂的模型中向下访问各种子属性,并且判断能否访问子属性的属性、方法和下标。

class Person {
    var residence: 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 let buildingNumber = buildingNumber, let street = street{
            return "\(buildingNumber) \(street)"
        } else {
            return nil
        }
    }
}
通过可选链式调用访问属性
func createAddress() -> Address {
    print("Function was called.")

    let someAddress = Address()
    someAddress.buildingNumber = "29"
    someAddress.street = "Acacia Road"

    return someAddress
}
john.residence?.address = createAddress()

说明:没有任何打印消息,可以看出 createAddress() 函数并未被执行

通过可选链式来调用方法
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 语句来判断能否成功调用 printNumberOfRooms() 方法,即使方法本身没有定义返回值。通过判断返回值是否为 nil 可以判断调用是否成功。

通过可选链式调用访问下标

注:通过可选链式调用访问可选值的下标时,应该将问号放在下标方括号的前面而不是后面。可选链式调用的问号一般直接跟在可选表达式的后面。

if let firstRoomName = john.residence?[0].name {
    print("The first room name is \(firstRoomName).")
} else {
    print("Unable to retrieve the first room name.")
}
访问可选类型的下标
var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
testScores["Bev"]?[0] += 1  //[80,94,81]
print(testScores)
连接多层可选链式调用

如果访问的值不是可选的,可选链式调用将会返回可选值.(通过可选链式调用访问一个 Int 值,将会返回 Int?,无论使用了多少层可选链式调用)
如果访问的值就是可选的,可选链式调用不会让可选返回值变得“更可选”(类似的,通过可选链式调用访问 Int? 值,依旧会返回 Int? 值,并不会返回 Int??)

在方法的可选返回值上进行可选链式调用

在一个可选值上通过可选链式调用来调用方法,并且可以根据需要继续在方法的可选返回值上进行可选链式调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值