Array is a structure that means the type of value in Swift. Because of this, arrays always behave according to value, rather than referential semantics. The problem here is that you are trying to use mutable link-based logic to work with value types.
You do not want to rely on mutations that occur inside a function to propagate back to the caller. As you have already seen, this is only possible with inout parameters. Instead, you should return the mutated array from the function back to the caller. The point of value-oriented programming is that it doesn't matter which array you have, but rather that any two equivalent arrays or value types are interchangeable.
A bit easier to imagine with a different type of value. Take Int, for example, and this function, which does some math.
func addFive(int: Int) -> Int { return int + 5 }
Now consider a similar function, but written in the style of orienteering that you are trying to use:
func addFive(inout int: Int) { int = int + 5 }
You can see that it is simply unnatural to work with value types in this way. Instead, just return the updated value (modified arrays) from your function and continue from there.
Here is your function reorganized using value semantics.
func move(source: [String], destination: [String], value:String) -> ([String], [String]) { var mutableSource = source var mutableDestination = destination mutableSource.removeAtIndex(source.indexOf(value)!) mutableDestination.append(value) return (mutableSource, mutableDestination) } let (updatedSource, updatedDestination) = move(odds, destination: evens, value:one)