On Tue, Jul 25, 2017 at 4:44 AM, philohan95 via swift-evolution <
[email protected]> 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()
}
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution