Swift中可选链

1.可选值的缺点

·使用可选值有时会让人感到有点笨拙,所有的解包和检查会变得如此繁重,以至于会让你想要丢几个感叹号上去强制解包,好让你能继续工作下去。但是请小心:如果你强制解包一个没有值的可选值,你的代码就崩了。为了解决这个缺点,wift引入两个特性,一是合并空值运算符,二是可选链。

2.可选链

·可选链是一个调用和查询可选属性、方法和下标的过程,它可能为nil。如果可选项包含值,属性、方法或者下标的调用成功;如果可选项是nil,属性、方法或者下标的调用会返回nil多个查询可以链接在一起,如果链中任何一个节点是nil,那么整个链就会得体地失败。

3.可选链代替强制展开

3.1.你可以通过在你希望如果可选项为非nil就调用属性、方法或者脚本的可选值后边使用问号(?)来明确可选链。这和在可选值后放叹号(!来强制展开它的值非常类似。主要的区别在于可选链会在可选项为nil时得体地失败,而强制展开则在可选项为nil时触发运行时错误。
3.2.为了显示出可选链可以在nil值上调用,可选链调用的结果一定是一个可选值,就算你查询的属性、方法或者下标返回的是非可选值。你可以使用这个可选项返回值来检查可选链调用是成功(返回的可选项包含值),还是由于链中出现了ni而导致没有成功(返回的可选值是nil)
3.3.另外,可选链调用的结果与期望的返回值类型相同,只是包装成了可选项。通常返回Int的属性通过可选链后会返回一个Int?

4.可选链代替强制展开

 class Person{
 var residence: Residence?
 }

 class Residence{
 var numberofRooms =1
 }

//调用
 let john = Person()
 let roomCount =  john. residence!. numberofRooms

可选链强制展开

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

5.为可选链定义模型类

class Room{
    
    let name: String
    init(name: String) {
        
        self.name=name
    }
    
}
class Address {
    
    var buildingName: String?
    var buildingNumber: String?
    var street: String?
    
    func buildingIdetifier() -> String? {
        
        if buildingName != nil {
        
            return buildingName
        }else if buildingName != nil && street != nil
        {
            return ""
        }else
        {
            return nil
        }
    }
    
}
class Residence{
    
    var rooms = [Room]()
    
    var numberOfRoom: Int {
        return rooms.count
    }
    
    subscript(i: Int)->Room
    {
        get{
            
            return rooms[i]
           }
        
        set{
            
            rooms[i] = newValue
        }
    }
    
    func priNumberOfRoom()  {
        
        print("The number of rooms is \(numberOfRoom)")
    }
    
    var address: Address?
}

通过可选链访问属性

        let john = Person()
        
        if let roomCount = john.residence?.numberOfRoom  {
            
            print("John's residence has \(roomCount) room(s).")
        }else
        {
            print("Unable to retrieve the number of rooms")
        }
        
        
        let someAddress = Address()
        someAddress.buildingNumber = "29"
        someAddress.street = "Acacia Road"
        john.residence?.address = someAddress

通过可选链访问属性

  func createAddress() -> Address {
        
        print("Function was calleed.---->不会被打印")
        
        let someAddress = Address()
        someAddress.buildingNumber = "29"
        someAddress.street = "Acacia Road"
        
        return someAddress
    }
    
    john.residence?.address = createAddress()

函数和方法没有返回类型就隐式地指明为Void类型.意思就是说他们返回一个()的值或者是一个空的元组.

 if john.residence?.numberOfRoom != nil  {
            
            print("John's residence has \(roomCount) room(s).")
        }else
        {
            print("Unable to retrieve the number of rooms")
        }

6.链的多层连接

你可以通过连接多个可选链来在模型中深入访问属性、方法以及下标。总之,多层可选链不会给返回的值添加多层的可选性。

也就是说:
如果你访问的值不是可选项,它会因为可选链而变成可选项
·如果你访问的值已经是可选的,它不会因为可选链而变得更加可选。

因此
·如果你尝试通过可选链取回一个Int值,就一定会返回Int?,不论通过了多少层的可选链;
·类似地,如果你尝试通过可选链访问Int?值,Int?一定就是返回的类型,无论通过了多少层的可选链。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值