public func ?? (optional: T?, defaultValue: @autoclosure () throws -> T?) rethrows -> T?
public func ?? (optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T
写法:a ?? b
-
a
是可选项 -
b
是可选项 或者 不是可选项 -
b
跟a
的存储类型必须相同- 如果
a
不为nil
,就返回a
- 如果
a
为nil
,就返回b
- 如果
b
不是可选项,返回a
时候会自动解包
- 如果
举例子:
如果 a
不为nil
,就返回 a
var a: Int? = 1
var b: Int? = 2
let c = a ?? b // c是Int?,Optional(1)
如果 a
为nil
,就返回 b
var a: Int? = nil
var b: Int? = 2
let c = a ?? b // c是Int?,Optional(2)
如果 a
为nil
,就返回 b
var a: Int? = nil
var b: Int? = nil
let c = a ?? b // c是Int?,nil
如果 a
不为nil
,就返回 a
如果 b
不是可选项,返回 a
时候会自动解包
var a: Int? = 1
var b: Int = 2
let c = a ?? b // c是Int,1
如果 a
为nil
,就返回 b
var a: Int? = nil
var b: Int = 2
let c = a ?? b // c是Int,2
多个空运算符一起使用
var a: Int? = 1
var b: Int? = 2
let c = a ?? b ?? 3 // c是Int, 1
解析:由于最右边是3
,所以c
的类型肯定是Int
类型
先看 a ?? b
由于 a
是可选类型,且不为nil
,同时 b
也是可选类型,所以 a ?? b
会返回可选类型的 a
再看 a ?? 3
由于 a
不为 nil
,所以返回 a
,但是 3
不是可选类型,所以 a
会自动解包为 1
var a: Int? = nil
var b: Int? = 2
let c = a ?? b ?? 3 // c是Int, 2
var a: Int? = nil
var b: Int? = nil
let c = a ?? b ?? 3 // c是Int, 3