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

Kevin Ballard kevin at sb.org
Sun Dec 13 16:21:08 CST 2015


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/20151213/8ed69aac/attachment.html>


More information about the swift-evolution mailing list