6

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?

2 Answers 2

10

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.

Sign up to request clarification or add additional context in comments.

Comments

2

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

1 Comment

I have a question. For example, I have an object which includes an array. And I pass this object through property of a UIViewController. What should I do to pass it as a reference?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.