# Challenge: Flattening nested optionals

**URL:** <https://forums.swift.org/t/challenge-flattening-nested-optionals/24083>\
**Category:** Using Swift\
**Created:** [May 3, 2019, 3:38am UTC](https://forums.swift.org/t/challenge-flattening-nested-optionals/24083 "2019-05-03T03:38:46Z")\
**Posts on this page:** 1\
**Showing post:** 3

<div class="post-metadata">

**Author:** ![gwendal.roue](https://sea2.discourse-cdn.com/swift/user_avatar/forums.swift.org/gwendal.roue/32/13992_2.png) [@gwendal.roue](https://forums.swift.org/u/gwendal.roue)\
**Post date:** [May 3, 2019, 6:29am UTC](https://forums.swift.org/t/challenge-flattening-nested-optionals/24083/3 "2019-05-03T06:29:00Z")

</div>

Another try:

```swift
private protocol _OptionalProtocol {
    var _deepUnwrapped: Any? { get }
}
extension Optional: _OptionalProtocol {
    fileprivate var _deepUnwrapped: Any? {
        if let wrapped = self { return deepUnwrap(wrapped) }
        return nil
    }
}
func deepUnwrap(_ any: Any) -> Any? {
    if let optional = any as? _OptionalProtocol {
        return optional._deepUnwrapped
    }
    return any
}

deepUnwrap(1) // 1
deepUnwrap(Optional<Int>.none) // nil
deepUnwrap(Optional<Int>.some(1)) // 1
deepUnwrap(Optional<Optional<Int>>.none) // nil
deepUnwrap(Optional<Optional<Int>>.some(Optional<Int>.none)) // nil
deepUnwrap(Optional<Optional<Int>>.some(Optional<Int>.some(1))) // 1

```

---

_[View the full topic](https://forums.swift.org/t/challenge-flattening-nested-optionals/24083)._
