为什么nil合并运算符包含一个隐式解包的默认值?

时间:2016-04-27 17:40:58

标签: swift

我看到没有理由让运算符隐式返回unwrapped可选项。但是它将隐式解包的可选默认值包装到可选(包装)中的重点是什么?我只是期望非可选的结果。我在这里想错了吗?

var defaultValue: Int! = 0
var optional: Int?

let result = optional ?? defaultValue

print(defaultValue.dynamicType) // ImplicitlyUnwrappedOptional<Int>
print(result.dynamicType) // Optional<Int>

2 个答案:

答案 0 :(得分:5)

查看声明了nil合并运算符的Swift模块。如果第二个操作数是非可选的(如果让Swift推断出类型),??显式返回一个可选项:

@warn_unused_result
public func ??<T>(optional: T?, @autoclosure defaultValue: () throws -> T?) rethrows -> T?

@warn_unused_result
public func ??<T>(optional: T?, @autoclosure defaultValue: () throws -> T) rethrows -> T


let val1: Int? = nil
let val2 = 1
let val3 = val1 ?? val2 // 1

val3.dynamicType // Int.Type

答案 1 :(得分:3)

问题仅仅是推断类型之一。不要让Swift在这里推断出这种类型。写下这个:

let result : Int = optional ?? defaultValue

现在,您将获得您期望的结果。