Swift-09-可空链式调用(Optional Chaining)
我对这个的理解就是:我们有可能会用到其他的属性或者方法,当我们在使用其他的时候,可以使用点语法去访问另一个的属性,这样的使用,就形成了链式访问。
可空链式调用是一种可以请求和调用属性、方法及下表的过程,它的可空性体现于请求调用的目标当前可能为空(nil)。如果可空的目标有值,那么调用就会成功;如果选择的目标为空nil,那么这个调用将返回空。多个连续的调用可以被链接在一起形成一个调用链,如果其中任何一个节点为空nil将导致整个链调用失败。
Attention:Swift的可空链式调用和OC中的消息为空有些相像,但是Swift可以使用在任意类型中,并且能够检查调用是否为空。
------如何定义为可空链呢?
在属性、方法、下表的可空值后面放一个问号,可以定义一个可空链。这一点很像在可空值后面放一个叹号!来强制展开其中值。他们的区别是,当可空值为空时,可空链式只是调用失败,然而强制展开将会触发运行时错误。
如果调用一个空对象的任何属性,将返回可空值,无论它的属性是不是可空值。可以通过返回值来判断你的可空链式调用是否调用成功,如果有返回值,则调用成功;如果返回nil则调用失败。
Expecially:可空链式调用的返回结果与原本的返回结果具有相同的类型,但是被包装成了一个可空类型值。当可空链式调用成功时,一个本应该返回Int的类型的结果将会返回Int?类型。
可空类型长什么样子呢?示例如下:
class Person {
var residence :Residence? //这个问号表明了residence是一个可空的属性,它的类型为Residence?
}
如果新建一个Person实例,因为它的residence属性是可空的,john的属性将初始化为nil。
let john = Person()
let roomCount = john.residence!.numberOfRooms
报错信息:fatal error: unexpectedly found nil while unwrapping an Optional value
当使用叹号!强制展开获得这个john的residence属性中的numberOfRooms值,会触发运行时错误,因为没有可以展开的residence。。
class Person {
var residence :Residence?
}
class Residence {
var numberOfRooms = 1
}
let john = Person()
let res:Residence = Residence()
let roomCount = john.residence?.numberOfRooms
print(roomCount)
print:nil
因为访问numberOfRooms有可能失败,可空链式调用会返回Int?类型,或者称为“可空的Int”。当实例为nil,将返回nil。
当给person的residence赋值后,就可以用返回值了:
let john = Person()
john.residence = Residence()
let roomCount = john.residence?.numberOfRooms
print(roomCount) 打印结果:Optional(1)
****为可空链式调用定义模型类
通过使用可空链式调用可以调用多层属性,方法,和下标。这样就可以通过各种模型向下访问各种子属性,并且判断能否访问子属性的属性、方法或下标。
-----通过可空链式调用来访问下标
可以通过下标来对可空值进行读取或写入,并且判断下标调用是否成功。当通过可空链式调用访问可空值的下标的时候,应该将问号放在下标方括号的前面,可空链式调用的问号一般直接跟在可空表达式的后面。
let johsnHouse = Residence()
johsnHouse.rooms.append(Room(name: "Living Room"))
johsnHouse.rooms.append(Room(name: "Kitchen"))
john.residence = johsnHouse if let roomCount = john.residence?.numberOfRooms{
print(roomCount)
}else{
print("ni;")
}
if let firstRoomName = john.residence?[0].name
{
print(firstRoomName)
}else{
print("meiyou")
} 运行结果:
2
Living Room
-----访问可空类型的下标
如果下标返回可空类型值,比如在Swift中Dictionary的key下标,可以在下标的闭合括号后面放一个问号来链接下标的可空返回值。
var testScores = ["Bev":[79,94,81],"Dave":[86,82,84]]
testScores["Dave"]?[0] = 91
testScores["Bev"]?[0]++
testScores["Brian"]?[0] = 72--->调用失败
print(testScores)
打印:
["Bev": [80, 94, 81], "Dave": [91, 82, 84]]
-----多层链接
可以通过链接多个可空链式调用来向下访问属性、方法及下标。但是多层可空链式调用不会添加返回值的可空性。
1.如果你访问的值不是可空的,通过可空链式调用将会返回可空值;
2.如果你访问的值已经是可空的,通过可空链式调用不会变的“更”可空;
if let johnStreet = john.residence?.address?.street
{
print(johnStreet)
}else{
print("not street")
}
let someAddress = Address()
someAddress.buildingNumber = "The 29"
someAddress.buildingName = "The ABC"
john.residence?.address = someAddress if let beginsWith = john.residence?.address?.buildingIdentifier()?.hasPrefix("The"){
if beginsWith{
print("the beig")
}else{
print("not the")
}
}else{
print(john.residence?.address?.buildingIdentifier())
}
在方法的圆括号后面加上问号,是因为buildIdentifier()的返回值是可空值,而不是方法本身是可空的。
Swift-09-可空链式调用(Optional Chaining)的更多相关文章
- Swift2.1 语法指南——可空链式调用
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- swift 学习- 19 -- 可选链式调用
// 可选链式调用 是一种在当前值可能为 nil 的可选值上请求 和 调用属性, 方法以及下标, 如果 可选值有值, 那么调用就会成功, 如果可选值是 nil, 那么就会将返回 nil , // 多个 ...
- Swift中可选型的Optional Chaining 和 Nil-Coalesce(Swift2.1)
/* 下面是介绍Optional Chaining 和 Nil-Coalesce */ // Optional Chaining (可选链) if let errorMessage = errorMe ...
- javascript链式调用实现方式总结
方法链一般适合对一个对象进行连续操作(集中在一句代码).一定程度上可以减少代码量,缺点是它占用了函数的返回值. 一.方法体内返回对象实例自身(this) function ClassA(){ this ...
- Swift Optional Chaining
Optional Chaining介绍 关于「optional chaining」,<The Swift Programming Language>是这么描述的: Optional cha ...
- 这一次搞懂Spring代理创建及AOP链式调用过程
文章目录 前言 正文 基本概念 代理对象的创建 小结 AOP链式调用 AOP扩展知识 一.自定义全局拦截器Interceptor 二.循环依赖三级缓存存在的必要性 三.如何在Bean创建之前提前创建代 ...
- 如何写 JS 的链式调用 ---》JS 设计模式《----方法的链式调用
1.以$ 函数为例.通常返回一个HTML元素或一个元素集合. 代码如下: function $(){ var elements = []; ;i<arguments.length;i++){ v ...
- jquery中链式调用原理
(1).链式调用 $("#mybtn").css("width","100px") .css("height",&quo ...
- javascript方法链式调用和构造函数链式调用对比
先说一下方法链:B的实例从A继承了A中的同名方法,如果B的方法重载了A中的方法,B中的重载方法可能会调用A中的重载方法,这种方法称为方法链. 构造函数链:子类的构造函数B()有时需要调用父类的构造函数 ...
随机推荐
- 【BZOJ】1048: [HAOI2007]分割矩阵
http://www.lydsy.com/JudgeOnline/problem.php?id=1048 题意:给出一个a×b(a,b<=10)的矩阵,带一个<=100的权值,现在要切割n ...
- 什么是SQL注入式攻击
什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响 ...
- FlyCaptureProperty 摄像机属性
An enumeration of the different camera properties that can be set via the API. Declaration enum FlyC ...
- android之发送短信程序
首先改写activity_main.xml文件 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/re ...
- shenyi 语录
[讲师]沈逸(65480539) 2016-06-08 14:58:42 会centos 转redhat是分分钟的事 [讲师]沈逸(65480539) 2016-06-08 14:58:54 查看 ...
- 【翻译】CEDEC2014跨世代多平台并行开发PS4版如龙维新开发的一年
本篇PPT讲述的是如龙4的开发过程中,集中在PS3和PS4并行开发中所遇到和解决的一些问题.如64位指针,DX9向DX11移植API的问题,以及在PS4上使用并行渲染在1080P下让FPS达到60等. ...
- Smart ECM数据发布假数据测试工作。
1. ScriptBom.java//文件方法供接口调用 代码: public String setBomEcnHistoryDataByXML(String strView){//传入arg文件名 ...
- Rails--%w用法[转]
%Q 用于替代双引号的字符串. 当你需要在字符串里放入很多引号时候, 可以直接用下面方法而不需要在引号前逐个添加反斜杠 (\") >> %Q(Joe said: "Fr ...
- MySQL binlog-do-db选项是危险的
很多人通过 binlog-do-db, binlog-ignore-db, replicate-do-db 和 replicate-ignore-db 来过滤复制(某些数据库), 尽管有些使用, ...
- 数据库MySql阶段总结
S1数据库中最重要的是查询,对于查询要有一个好的理解模型是很关键的: 1. 每一个查询都会返回一个结果集,这个结果集可能是一个值,一个字段或者一个记录,甚至可能是一个表 返回一个值 SELECT * ...