我正在尝试编写一个函数来解开具有任意数量嵌套级别的选项。这是我正在使用的测试:
let a: Int??? = 1
let b: Int??? = nil
print(a.unwrap(0), b.unwrap(0)) // should print 1, 0
我可以使用基本的通用函数获得正确的输出:
extension Optional {
func unwrap<T> (_ defaultValue: T) -> T {
return (self as? T) ?? defaultValue
}
}
print(a.unwrap(0), b.unwrap(0)) // 1, 0
但这并不妨碍使用与可选类型不同的类型调用该函数。例如,我可以打电话a.unwrap("foo")
,它会打印“foo”而不是“1”,因为你当然不能Int???
转换为String
.
我尝试使用它Wrapped
,它半正确地限制了默认值,但没有给出正确的输出:
extension Optional {
func unwrap (_ defaultValue: Wrapped) -> Wrapped {
return (self as? Wrapped) ?? defaultValue
}
}
print(a.unwrap(0), b.unwrap(0)) // Optional(Optional(1)), nil
它只解开一个可选级别,而不是全部三个,并且由于 nil 是一个有效值,Int??
因此它不会返回默认值。
有什么方法可以安全地做我想做的事吗?