[swift-evolution] [Pitch] Make try? + optional chain flattening work together

Russ Bishop rbishopjr at apple.com
Fri Jan 12 11:25:37 CST 2018

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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20180112/91dcbe15/attachment.html>

More information about the swift-evolution mailing list