Я пытаюсь написать функцию для разворачивания опциональных файлов с произвольным количеством уровней вложенности. Вот тест, который я использую:
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??
, он не возвращает значение по умолчанию.
Есть ли способ безопасно сделать то, что я хочу здесь?