Just having getters and setters doesn’t allow this (unless the optimiser is 
really smart about it). All the current API allows is grabbing whatever the 
`get` clause returns, mutating it, and then passing it into the `set` clause, 
whatever that does. The `set` clause might not do anything, or what it does 
could be seemingly unrelated to the `get` clause, so it’s not a trivial task to 
optimise this.
> On 11 Oct 2016, at 06:35, Erica Sadun <er...@ericasadun.com> wrote:
> 
> 
>> On Oct 10, 2016, at 9:53 PM, Tim Vermeulen via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> There have been many instances where unexpected bad performance was caused 
>> by the interplay between getters, setters, mutations and the copy-on-write 
>> mechanism. For example:
>> 
>> struct Foo {
>>     private var _array: [Int] = [1, 2, 3, 4, 5]
>>     
>>     var array: [Int] {
>>         get { return _array }
>>         set { _array = newValue }
>>     }
>> }
>> 
>> var foo = Foo()
>> foo.array.append(6) // an O(n) operation
>> 
>> I propose a `mutate` clause which provides a `mutate` function with a single 
>> inout parameter (similar to how `set` provides `newValue`), which can be 
>> used instead of a setter:
>> 
>> var array: [Int] {
>>     get { return _array }
>>     mutate { mutate(&_array) }
>> }
>> 
>> The compiler could then translate each mutation of `foo.array` to a closure 
>> with an inout parameter, which is then passed into the `mutate` clause 
>> (which in turn is executed with `_array` as its argument, as per the snippet 
>> above). For example, for `foo.array.append(6)`, the compiler would 
>> internally generate the closure `{ (arr: inout [Int]) in arr.append(6) }` 
>> and pass it into the `mutate` clause, `_array` is then passed as its 
>> parameter and the array is updated in constant time.
>> 
>> I apologise if that was too hard to follow.
>> 
>> No setter would be needed if a mutation clause is provided, but I see no 
>> good reason to do away with setters altogether, so this proposal would be 
>> purely additive.
> 
> If this is computationally better, why is it not the default behavior rather 
> than an API change?
> 
> -- E
> 
> 

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to