//可选链式调用

import UIKit

/*可选链式调用(Optional Chaining)

1.在可选值上请求和调用该可选值的属性、方法及下标的方法,如果可选值有值,那么调用就会成功,返回可选类型值,如果可选值是nil,那么调用将返回nil,多个调用可以连接在一起形成一个调用链,如果其中任何一个节点为nil,整个调用链都会失败,即返回nil;(而强制展开它的值是"!",有值则返回该值,无值则会触发运行时错误)

2.通过在想调用的属性、方法、或下标的可选值(optional value)后面放一个问号"?"

3.可选链式调用返回的是可选类型值,它的返回结果与原本的返回结果具有相同的类型,但是被包装成了一个可选值

访问可选类型的下标:

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

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

在方法的可选返回值上进行可选链式调用,在方法的圆括号后面加上问号

let beginsWithThe = john.residence?.address?.buildingIdentifier()?.hasPrefix("The")

在方法的圆括号后面加上问号是因为你要在buildingIdentifier()方法的可选返回值上进行可选链式调用,而不是方法本身。

*/

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

if let roomCount = john.residence?.numberOfRooms {      //因为john.residence为nil,调用失败,返回nil

print("John's residence has \(roomCount) room(s).")

} else {

print("Unable to retrieve the number of rooms.")

}

// 打印 “Unable to retrieve the number of rooms.”

let someAddress = Address()

someAddress.buildingNumber = "29"

someAddress.street = "Acacia Road"

john.residence?.address = someAddress                   //因为john.residence当前为nil,调用失败,等号右侧的代码不会被执行,赋值失败

if john.residence?.printNumberOfRooms() != nil {        //调用方法失败,返回nil,如果成功则返回void?

print("It was possible to print the number of rooms.")

} else {

print("It was not possible to print the number of rooms.")

}

// 打印 “It was not possible to print 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 the address.")

}

// 打印 “It was not possible to set the address.”

if let firstRoomName = john.residence?[0].name {        //通过可选链式调用访问数组下标

print("The first room name is \(firstRoomName).")

} else {

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

}

// 打印 “Unable to retrieve the first room name.”

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

print("The first room name is \(firstRoomName).")

} else {

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

}

// 打印 “Unable to retrieve the first room name.”

john.residence?[0] = Room(name: "Bathroom")

if let johnsStreet = john.residence?.address?.street {      //连接多层可选链式调用

print("John's street name is \(johnsStreet).")

} else {

print("Unable to retrieve the address.")

}

// 打印 “Unable to retrieve the address.”

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

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

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

testScores["Brian"]?[0] = 72        //testScores字典中没有"Brian"这个键,所以第三个调用失败。

// "Dave" 数组现在是 [91, 82, 84],"Bev" 数组现在是 [80, 94, 81]

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

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

}

// 打印 “John's building identifier is The Larches.”

if let beginsWithThe =

john.residence?.address?.buildingIdentifier()?.hasPrefix("The") {   //在方法的可选返回值上进行可选链式调用,在方法的圆括号后面加上问号

if beginsWithThe {

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

} else {

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

}

}

// 打印 “John's building identifier begins with "The".”

swift学习笔记之-可选链式调用的更多相关文章

  1. swift 学习- 19 -- 可选链式调用

    // 可选链式调用 是一种在当前值可能为 nil 的可选值上请求 和 调用属性, 方法以及下标, 如果 可选值有值, 那么调用就会成功, 如果可选值是 nil, 那么就会将返回 nil , // 多个 ...

  2. javascript学习(10)——[知识储备]链式调用

    上次我们简单的说了下单例的用法,这个也是在我们java中比较常见的设计模式. 今天简单说下链式调用,可能有很多人并没有听过链式调用,但是其实只要我简单的说下的话,你肯定基本上都在用,大家熟知的jQue ...

  3. 【Swift学习】Swift编程之旅---可选链(二十一)

    可选链Optional Chaining是一种可以在当前值可能为nil的可选值上请求和调用属性.方法及下标的方法.如果可选值有值,那么调用就会成功:如果可选值是nil,那么调用将返回nil.多个调用可 ...

  4. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  5. Swift 学习笔记(五)

    126. 协议(Protocols) 协议语法(Protocol Syntax) 属性要求(Property Requirements) 方法要求(Method Requirements) Mutat ...

  6. Swift 学习笔记(四)

    116.使用可选链式调用代替强制展开 通过在想调用的属性.方法.或下标的可选值(optional value)后面放一个问号(?),可以定义一个可选链.这一点很像在可选值后面放一个叹号(!)来强制展开 ...

  7. 《javascript设计模式》笔记之第六章:方法的链式调用

    这一章要实现的就是jQuery的那种链式调用,例子: $(this).setStyle('color', 'green').show(); 一:调用链的结构: 首先我们来看一下最简单的$()函数的实现 ...

  8. Swift2.1 语法指南——可空链式调用

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  9. JavaScript中的链式调用

    链模式 链模式是一种链式调用的方式,准确来说不属于通常定义的设计模式范畴,但链式调用是一种非常有用的代码构建技巧. 描述 链式调用在JavaScript语言中很常见,如jQuery.Promise等, ...

随机推荐

  1. 《BI那点儿事》数据挖掘的主要方法

    一.回归分析目的:设法找出变量间的依存(数量)关系, 用函数关系式表达出来.所谓回归分析法,是在掌握大量观察数据的基础上,利用数理统计方法建立因变量与自变量之间的回归关系函数表达式(称回归方程式).回 ...

  2. JavaScript闭包(二)——作用

    一.延迟调用 当在一段代码中使用 setTimeout 时,要将一个函数的引用作为它的第一个参数,而将以毫秒表示的时间值作为第二个参数. 但是,传递函数引用的同时无法为计划执行的函数提供参数.可以在代 ...

  3. TortoiseSVN安装以及淘宝 TAE SDK 开发环境的搭建

    一.TortoiseSVN 的下载和安装 1.进入TortoiseSVN 官网下载地址http://tortoisesvn.net/downloads.html,根据自己的操作系统位数下载相应最新版本 ...

  4. 机器学习&数据挖掘笔记_13(用htk完成简单的孤立词识别)

    最近在看图模型中著名的HMM算法,对应的一些理论公式也能看懂个大概,就是不太明白怎样在一个具体的机器学习问题(比如分类,回归)中使用HMM,特别是一些有关状态变量.观察变量和实际问题中变量的对应关系, ...

  5. Testing - 测试基础 - 模型

    珠玉在前,不再赘言. 软件测试模型 软件测试模型汇总

  6. Hadoop入门学习笔记---part1

    随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...

  7. SQL Server 索引的创建原则

    避免对经常更新的表进行过多的索引,并且索引中的列尽可能少.而对经常用于查询的字段(外键)应该创建索引,但要避免添加不必要的字段. 数据量小的表最好不要使用索引,由于数据较少,查询花费的时间可能比遍历索 ...

  8. Struts2 源码分析——Hello world

    新建第一个应用程序 上一章我们讲到了关于struts2核心机制.对于程序员来讲比较概念的一章.而本章笔者将会亲手写一个Hello world的例子.所以如果对struts2使用比较了解的朋友,请跳过本 ...

  9. PHP的反射机制

    在面向对象中最经典的使用就是反射,之前在Java语言中,使用反射可以解耦,用于依赖注入. 在PHP中,同样也有如此强大的地方,我们利用反射来获取一个对象的实例. 首先我们先写一个类: class Te ...

  10. ADO.NET基础--组成部分

    第一部分:数据提供程序,在命令空间:System.Data.SqlClient下: Connection--连接数据库的通道 Command----命令执行对象 DataReader--数据读取器 D ...