[swift-evolution] [Review] SE-0176: Enforce Exclusive Access to Memory

Nevin Brackett-Rozinsky nevin.brackettrozinsky at gmail.com
Mon May 8 09:56:13 CDT 2017

On Sun, May 7, 2017 at 2:04 PM, Xiaodi Wu via swift-evolution <
swift-evolution at swift.org> wrote:

> Actually, `swapAt` does have a precondition that the elements differ.

Looking at the source code
the “swapAt” method is documented to have no effect when the indices are

/// Exchange the values at indices `i` and `j`.
/// Has no effect when `i` and `j` are equal.
mutating func swapAt(_ i: Index, _ j: Index)

Furthermore, the default implementation simply returns early when given the
same index twice:

extension MutableCollection {
  public mutating func swapAt(_ i: Index, _ j: Index) {
    guard i != j else { return }
    let tmp = self[i]
    self[i] = self[j]
    self[j] = tmp

Contrast that with “swap” (found here
which is documented with “Precondition: `a` and `b` do not alias each
other.” And the implementation enforces that (at least in debug builds)

_debugPrecondition(p1 != p2, "swapping a location with itself is not

So it looks like the precondition is only found on “swap”, and “swapAt”
should work properly (by doing nothing) when asked to exchange a single
index with itself.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170508/72fc8a82/attachment.html>

More information about the swift-evolution mailing list