Swift Array optional Type and Subscription (Beta 3)

I am following the 2014 WWDC 408: Swift Playgrounds tutorial using Xcode Beta 3 (30 minutes). 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 can't I change a mutable array of integers this way?

+6
source share
2 answers

Since the parameters of the subroutine are implicitly determined using let , therefore, they are not changed. Try changing your ad:

 func exchange<T>(inout data: [T], i: Int, j: Int) { 

and a call for:

 exchange(&date, 0, 2) 

You can also use var , but this will only allow you to modify the array as part of the routine. The big change for beta 3 was to make arrays really value-transmitted, not just sort of sorting by value for a while, but not the rest.

+10
source

@David's answer is correct, let me explain why: arrays (as well as dictionaries and strings) are value types (structs), not reference types. When a value type is to be passed to a function, a copy is created, and the function works on that copy.

Using the inout modifier, the original array is passed instead, so you can make changes to it in this case.

+2
source

Source: https://habr.com/ru/post/972113/


All Articles