寒城攻略:Listo 教你 25 天学会 Swift 语言 - 19 Optional Chaining

寒城攻略:Listo 教你 25 天学会 Swift 语言 - 19 Optional Chaining,第1张

概述import Foundation     //***********************************************************************************************     //1.Optional Chaining(自判断链接)     //_________________________________________


importFoundation


//***********************************************************************************************

//1.Optional Chaining(自判断链接)

//_______________________________________________________________________________________________

//介绍

//自判断链接是一种可以请求和调用属性,方法以及子脚本的过程,他的自判断性体现于请求或者调用的目标当前可能为空。如果自判断的目标有值,那么他的调用就会成功;如果目标为空,返回 nil

//***********************************************************************************************

//2.Optional Chaining as an Alternative to Forced UnwrapPing(自判断链接可以替代强制拆包)

//通过在想调用属性,方法,或者子脚本的自判断值(非空)后放一个问号,可以定义一个自判断链接。

//_______________________________________________________________________________________________

//代码演示自判断链接和强制拆包的不同

class Person{ //Person 具有一个自判断 resIDence 属性

var resIDence: ResIDence?

}

class ResIDence{ //ResIDence 具有一个 Int 类型的 numberOfRooms

var numberOfRooms = 1

}

let john = Person() //因为 Person 类中 resIDence 为自判断型,所以在创建实例的时候 resIDence 属性默认为空

//let roomCount = john.resIDence!.numberOfRooms //如果我们此刻想要强制拆包的话,因为 john.resIDence nil,程序错误,只有当 john.resIDence 不为空的时候,程序才能运行

if let roomCount = john.resIDence?.numberOfRooms{ //使用自判断链接提供了另外一种方式去获取类实例属性,这时不会抱错,而是以 nil 的形式表示 john.resIDence

println("john's resIDence has \(roomCount) room")

}

else{

println("Unable to retrIEve the number of rooms")

}

john.resIDence = ResIDence() //自己定义一个 ResIDence 实例给 john.resIDence 这时它就不是空了

if let roomCount = john.resIDence?.numberOfRooms{

//3.Defining Model Classes for Optional Chaining(为自判断链接定义模型类)

//我们可以使用自判断链接来多层调用属性,方法和子脚本

class Person1{

var resIDence1: ResIDence1?

}

class ResIDence1{

var rooms = [Room]() //初始化 rooms 为一个空数组,存储的元素必须为 Room 类型

var numberOfRooms: Int{

return rooms.count

}

subscript(i: Int) -> Room{ //为了快速访问 rooms 数组, ResIDence1 定义了一个只读的子脚本,通过插入角标就可以成功调用

return rooms[i]

}

func printNumberOfRooms(){ //打印房间个数

println("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{

return nil

}

}

}

//4.Calling PropertIEs Through Optional Chaining(通过自判断链接调用属性)

//代码演示使用自判断链接替代强制拆包获取属性,并且检查属性是否获取成功

let john1 = Person1()

if let roomCount = john1.resIDence1?.numberOfRooms{ //由于 john1.resIDence1 nil,所以执行 else 中的语句

println("john's resIDence has \(roomCount) rooms")

}

println("Unabel to retrIEve the number of rooms")

}

//5.Calling Methods Through Optional Chaining(通过自判断链接调用方法)

//实例代码演示自判断链接调用方法

if john1.resIDence1?.printNumberOfRooms() != nil {

println("is was possible to print the number of rooms")

}

println("it was not possible to print the number of rooms")

}

//6.Calling Subscripts Through Optional Chaining(通过自判断链接调用子脚本)

//实例代码演示通过自判断链接调用子脚本

if let firstRoomname = john1.resIDence1?[0].name {

println("The first room is \(firstRoomname)")

}

println("Unable to retrIEve the first room name")

}

let Listo = ResIDence1()

Listo.rooms.append(Room(name: "Pin"))

Listo.rooms.append(Room(name: "Melody"))

john1.resIDence1 = Listo // john1.resIDence1 创建实例

if let firstRoomname = john1.resIDence1?[0].name{

println("the first room is \(firstRoomname)")

}

println("Unable to retrIEve the first room name")

}

//7.Clinking Multiple Levels of Chaining(连接多层链接)

//代码演示连接多层链接

if let johnsstreet = john1.resIDence1?.address?.street{ //此时 john1.resIDence1 不是 nil,但 john1.resIDence1.address nil,所以返回 else 语句

println("john's street name is \(johnsstreet)")

}

println("Unable to retrIEve the address")

}

let address = Address()

address.buildingname = "The Larches"

address.street = "laurel Street"

john1.resIDence1!.address = address // john1.resIDence1.address 赋值

println("Unable to retrIEve the address")

}

//8.Chaining on Methods With Optional Return Values(链接自判断返回值的方法)

//代码实例演示自判断连接的返回值方法

if let buildingIDentifIEr = john1.resIDence1?.address?.buildingIDentifIEr(){

println("john's building IDentifIEr is \(buildingIDentifIEr)") //返回的值依旧是 String 类型的自判断链接

}

if let buildingIDentifIEr = john1.resIDence1?.address?.buildingIDentifIEr()?.uppercaseString{ //当继续对自判断链接执行 *** 作室,使用 ?. 来间隔方法

println("john's building IDentifIEr is \(buildingIDentifIEr)") //类型的自判断链接

}


转载:http://blog.csdn.net/u013096857/article/details/37872123 总结

以上是内存溢出为你收集整理的寒城攻略:Listo 教你 25 天学会 Swift 语言 - 19 Optional Chaining全部内容,希望文章能够帮你解决寒城攻略:Listo 教你 25 天学会 Swift 语言 - 19 Optional Chaining所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1089091.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存