Greetings swift-evolution!

There is currently a disconnect between optional chaining and try? when it 
comes to optional flattening:


struct SomeType {
    func nonThrow() -> SomeType? { return self }
    func doThrow() throws -> SomeType? { return self }
    func nonOptional() throws -> SomeType { return self }
}

let w = SomeType().nonThrow()?.nonThrow()?.nonThrow()?.nonThrow()
// w has type SomeType?

let x = try? SomeType().nonOptional().nonOptional().nonOptional().nonOptional()
// x has type SomeType?

let y = try! SomeType().doThrow()?.doThrow()?.doThrow()?.doThrow()
// y has type SomeType?

let z = try? SomeType().doThrow()?.doThrow()?.doThrow()?.doThrow()
// z has type SomeType??


We get a double-optional only when combining try? and optional-chaining. That 
is inconvenient and it would be natural to have the compiler do the flattening 
here.


If anyone is interested in working on the proposal or implementation please let 
me know. It would make a nice self-contained task if you're looking to start 
contributing.


Russ Bishop
 Simulator


_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to