我看到没有理由让运算符隐式返回unwrapped可选项。但是它将隐式解包的可选默认值包装到可选(包装)中的重点是什么?我只是期望非可选的结果。我在这里想错了吗?
var defaultValue: Int! = 0
var optional: Int?
let result = optional ?? defaultValue
print(defaultValue.dynamicType) // ImplicitlyUnwrappedOptional<Int>
print(result.dynamicType) // Optional<Int>
答案 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
现在,您将获得您期望的结果。