Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 226
Iain Waugh Avatar asked Jul 12 '14 06:07

Iain Waugh


2 Answers

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.

like image 68
David Berry Avatar answered Nov 12 '22 06:11

David Berry


@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.

like image 41
Antonio Avatar answered Nov 12 '22 05:11

Antonio