[swift-evolution] Constant generic properties in mutable contexts
Maximilian Hünenberger
m.huenenberger at me.com
Sat Jan 30 13:26:50 CST 2016
Oh ok I see. I'm sorry to hold you off more important topics.
- Maximilian
> Am 30.01.2016 um 19:21 schrieb Joe Groff <jgroff at apple.com>:
>
> This wouldn't change anything with value types. Even if you're not allowed to say:
>
> array[0].name = "Sam"
>
> You can still say:
>
> array[0] = Person(name: "Sam")
>
> which is equivalent; you're just making it less convenient and harder to optimize. Piecewise mutation of value types is a feature, not a bug, and doesn't have most of the pitfalls of shared mutable reference types.
>
> -Joe
>
>> On Jan 30, 2016, at 7:27 AM, Maximilian Hünenberger via swift-evolution <swift-evolution at swift.org> wrote:
>>
>> Hi all,
>>
>> If you have an Array which is declared as mutable variable all contents are implicitly mutable. This is unfortunate especially in case of value types.
>>
>> Consider this code example:
>>
>> struct Person { var name: String }
>>
>> var array = [Person(name: "Smith")]
>> // all persons are implicitly mutable
>> array[0].name = "Sam"
>>
>>
>> So I propose a language feature which addresses this issue:
>>
>> var array: [let Person] = [Person(name: "Smith")]
>> // all persons are immutable
>> array[0].name = "Sam" // error
>>
>> // but still allowing to add and remove persons
>> array[0] = Person(name: "Sam")
>>
>>
>> For clarification: The semantics are the same as if you've wrapped the struct in a class with a "let" property:
>>
>> class ConstantWrapper<T> {
>> let value: T
>> init(_ value: T) { self.value = value }
>> }
>>
>> var array = [ConstantWrapper(Person(name: "Smith"))]
>> // all persons are "indirect" immutable
>> array[0].value.name = "Sam" // error
>>
>>
>> This model would allow for more immutability in mutable contexts which ultimately leads to less bugs.
>>
>>
>> ##Possible Extensions:
>>
>> We could also allow a "var" declaration:
>>
>> let array: [var Person] = ...
>>
>> The array models a fixed length array which is highly suggested by some people but you cannot assign a new "Person" to a specific index which is unfortunate. Although this could be solved by tweaking the current model.
>>
>>
>> Best regards
>> - Maximilian
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160130/d7a7aef1/attachment.html>
More information about the swift-evolution
mailing list