[swift-evolution] Assignment to 'let' constant in defer blocks

David Sweeris davesweeris at mac.com
Sat Mar 11 13:36:58 CST 2017

> On Mar 11, 2017, at 9:49 AM, andrew at arnopoulos.io wrote:
> How would that work for a subclass, if all properties of a class need to be initialized before the parent's initializer is called?
> -Andrew
> On Mar 11, 2017, at 8:46 AM, Derrick Ho via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> Seems like it should work. Maybe it is a bug that should be reported to SR.
>> Does this error occur for non-failable initializers?
>> On Sat, Mar 11, 2017 at 12:33 AM David Sweeris via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> Is this a feature or a bug?
>> class Foo {
>>     let bar: Int
>>     init?(someConditionBasedOnInputData: Bool) {
>>         var localBar: Int = 0
>>         defer {
>>             bar = localBar //Cannot assign to property: 'bar' is a 'let' constant
>>         }
>>         if someConditionBasedOnInputData {
>>             return nil
>>         }
>>     }
>> }
>> It’d be handy to be able to do the assignment upfront in a defer block in cases where there’s both a bunch of validation to do on the input data, and no harm from assigning the interim values to the final values when you’re about to return nil anyway.

If I was trying to subclass something and add extra instance variables, yeah, I don’t think it would work. I’m not trying to subclass anything in this case, though.

- Dave Sweeris
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170311/95bf2808/attachment.html>

More information about the swift-evolution mailing list