
226 第
8
章
链式安全调用
使用安全调用的另一个优点是你可以将它们链式地组装起来,
从而形成强大又简练的表达式。
假设你有一个名为
MyWolf
的
类 ,它 只 有 一 个
Wolf?
类型的属性
w
,
这是该类的定义:
class MyWolf {
var w: Wolf? = Wolf()
}
又假设你有一个
MyWolf?
类
型的变量名为
myWolf
,比如:
var myWolf: MyWolf? = MyWolf()
如果你想要获得
myWolf
变
量中
Wolf
对象的
hunger
属 性 值 ,你 可
以采用这样的写法:
myWolf?.w?.hunger
这就像在说“如果
myWolf
或者
w
为
空,则返回空值,否则返回
w
的
hu
nger
属性值”。该表达式返回
hunger
属 性 值 ,当 且 仅 当
myWolf
和
w
都
不 为 空 。如 果
myWolf
和
w
有一个为空,则整个表
达式的计算结果为空。
系统判断
myWolf
不为空
。
如果
myWolf
为空
,那么整个表达式的结果为空。如果
myWolf
不为空
(如例子所示),系统继续检查表达式的下一部分。
1
myWolf?.w?.hunger
引用
myWolf
var MyWolf?
MyWolf
myWolf?.w?.hunger
求解安全调用链时发生了什么
拆解系统求解安全调用链的过程。
如果
myWolf
和
w
都不为空
,
取得
hunger
,
否则为空
。
链式