Swift Array optional Type and subscripting (Beta 3)
I'm following the 2014 WWDC tutorial 408: Swift Playgrounds using XCode Beta 3 (30 minutes in). The Swift syntax has changed since Beta 2.
var data = [27, 46, 96, 79, 56, 85, 45, 34, 2, 57, 29, 66, 99, 65, 66, 40, 40, 58, 87, 64]
func exchange<T>(data: [T], i: Int, j: Int) {
let temp = data[i]
data[i] = data[j] // Fails with error '@lvalue $T8' is not identical to 'T'
data[j] = temp // Fails with error '@lvalue $T5' is not identical to 'T'
}
exchange(data, 0 , 2)
data
Why I can't modify a mutable integer array in this way?
Because subroutine parameters are implicitly defined with let
hence, non mutable. Try changing the declaration to:
func exchange<T>(inout data: [T], i: Int, j: Int) {
and the invocation to:
exchange(&date, 0, 2)
You can also use var
but that would only allow the array to be modified within the subroutine. The big change for beta 3 was to make arrays really pass by value instead of just kind of sorta pass by value some of the time, but not the rest.
@David answer is correct, let me explain why: arrays (as well as dictionaries and strings) are value types (structs) and not reference types. When a value type has to be passed to a function, a copy of it is created, and the function works on that copy.
By using the inout
modifier, the original array is passed instead, so in that case it's possible to make changes on it.