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

Kevin Ballard kevin at sb.org
Sat Jan 9 18:48:10 CST 2016


Proposal PR submitted as 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160109/5d5fed21/attachment.html>


More information about the swift-evolution mailing list