[swift-evolution] Proposal: Add replace(_:with:) function to the stdlib

Jordan Rose jordan_rose at apple.com
Mon Jan 11 15:22:53 CST 2016


-1 from me as well, for the same reason as Dave. In the Dictionary case, doing a lookup and then a replacement isn't just more verbose; it's actually less efficient. And I still wouldn't embed an updateValue(_:forKey:) in a larger expression, for clarity's sake.

Now, admittedly, if the assigned-to value were some complicated expression (e.g. "view.frame.size.height"), the same performance argument applies. But I still think I'd rather people just use a temporary variable.

self.task?.cancel()
self.task = nil

let oldValue = self.prop
self.prop = newValue
if let oldValue = oldValue {
  // multi-line cleanup
}

I'll admit the latter is not as nice, but it's definitely easier for me to read.

Jordan


> On Jan 9, 2016, at 16:48, Kevin Ballard via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Proposal PR submitted as https://github.com/apple/swift-evolution/pull/93 <https://github.com/apple/swift-evolution/pull/93>
>  
> -Kevin Ballard
>  
> On Sun, Dec 13, 2015, at 02:21 PM, Kevin Ballard wrote:
>> A function I find myself defining in a lot of my projects looks like the following:
>>  
>> /// Replace the value of `a` with `b` and return the old value.
>> public func replace<T>(inout a: T, with b: T) -> T {
>>     var value = b
>>     swap(&a, &value)
>>     return value
>> }
>>  
>> This is a pretty simple function, and useful in a wide variety of circumstances, so I'd love to get it into the standard library. It doesn't actually enable any behavior that wasn't previously possible, but it does shrink some common code patterns, and I find the shorter code easier to read.
>>  
>> An example of a place where I use it often is in replacing an optional property with a new value (or with nil) and cleaning up the previous value. Assuming a property like
>>  
>> var task: NSURLSessionTask?
>>  
>> This replaces
>>  
>> if let task = self.task {
>>     task.cancel()
>> }
>> task = nil
>>  
>> with
>>  
>> replace(&task, with: nil)?.cancel()
>>  
>> Or sometimes I use it like
>>  
>> if let value = replace(&prop, with: newValue) {
>>     // multi-line cleanup
>> }
>>  
>> This is particularly nice if it's a COW value that I want to mutate, as it means I don't have to worry about getting unwanted copies due to the property still holding the old value while I muck with it.
>>  
>> Question: For trivial backwards-compatible API changes like this, does a proposal PR need to be submitted to the swift-evolution repo, or is discussion on this ML sufficient before submitting a patch?
>>  
>> -Kevin Ballard
>  
> 
> _______________________________________________
> 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/20160111/ca28f85b/attachment.html>


More information about the swift-evolution mailing list