[swift-evolution] Idea: Properties in Failable Initializers less verbose

Rob Mayoff mayoff at dqd.com
Tue Jul 25 16:34:58 CDT 2017


On Tue, Jul 25, 2017 at 4:44 AM, philohan95 via swift-evolution <
swift-evolution at swift.org> wrote:

> As you can see we had to use the properties twice (this would also be the
> case of `if let`) making the initializer twice as long as necessary and
> becomes a pain to implement when having more than 1 property.
>

> My idea is extending the power of the `guard` statement
>
> Idea:
>         init?(data: [String: Any]) {
>                 guard
>                         someProperty = data["some_key"], // Currently
> fails because `self` us used before all stored properties are initialized
>                         anotherProperty = data["another_key"]
>                 else {
>                         return nil
>                 }
>         }
> }
>

I'm not convinced new syntax is necessary. You can get pretty close to this
today. First, put this in your project somewhere:

struct NilError: Error { }

func throwNilError<Whatever>() throws -> Whatever {
    throw NilError()
}

Then use do/try/catch to initialize your properties:

class MyObject {
    let someProperty: Any
    let anotherProperty: Any

    init?(data: [String: Any]) {
        do {
            someProperty = try data["some_key"] ?? throwNilError()
            anotherProperty = try data["another_key"] ?? throwNilError()
        } catch {
            return nil
        }
    }
}

It also works for Charles Srstka's example:

let bar: String
if someCondition {
    do { bar = mightReturnOptional() ?? throwNilError() }
    catch { return }
} else {
    bar = wontReturnOptional()
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170725/2bac4a82/attachment.html>


More information about the swift-evolution mailing list