概念
??
这个操作符可以快速的对nil进行条件判断。这个操作符可以判断:在左侧的值是 非nil的Optional值时返回其value,当左侧是nil时返回右侧的值。 比如:
var a: Int?
var b: Int = 1
var c = a ?? b
查看api,定义如下:
//第一个参数是:可选值
//第二个参数是:闭包
func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T?) rethrows -> T?
func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T
理解:
-
思考:这里为什么要使用
autoclosure
,直接接受defaultValue
作为参数并返回不行么,为什么要用()-> T
这样的形式包装一边,岂不是画蛇添足。 -
答:这正是
@autoclosure
的优点,如果我们直接使用defaultValue
,那意味着在??
操作符真正取值之前,我们必须准备好一个默认值传入到这个方法中,一般来说不会有太大的问题,但是如果这个默认值是通过一系列计算得到的话,可能会造成浪费--因为 如果Optional
不是nil的话,我们实际上是完全没有用到这个默认值,而会直接返回optional
解包后的值。这样的开销是完全可以避免的,方法就是将默认值的计算推迟到optional
判断为nil
之后。 -
注意:“最后要提一句的是,@autoclosure 并不支持带有输入参数的写法,也就是说只有形如 () -> T 的参数才能使用这个特性进行简化。另外因为调用者往往很容易忽视 @autoclosure 这个特性,所以在写接受 @autoclosure 的方法时还请特别小心,如果在容易产生歧义或者误解的时候,还是使用完整的闭包写法会比较好”。
网友评论