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