Swift Array opzionale Type e subscripting (Beta 3)

Sto seguendo il tutorial WWDC 408 del 2014: Swift Playgrounds che utilizza XCode Beta 3 (30 minuti in). La syntax Swift è cambiata dalla 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(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 

Perché non posso modificare un array intero mutabile in questo modo?

Poiché i parametri di subroutine sono definiti implicitamente con let , quindi non mutable. Prova a cambiare la dichiarazione in:

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

e l’invocazione a:

 exchange(&date, 0, 2) 

È anche ansible utilizzare var ma ciò consentirebbe solo la modifica dell’array all’interno della subroutine. Il grande cambiamento per la beta 3 era di far sì che gli array passassero davvero per valore invece che solo una sorta di genere passasse di valore un po ‘di tempo, ma non il resto.

@David answer è corretta, lasciatemi spiegare perché: gli array (così come i dizionari e le stringhe) sono tipi di valore (structs) e non tipi di riferimento. Quando un tipo di valore deve essere passato a una funzione, viene creata una copia di essa e la funzione funziona su quella copia.

Usando il modificatore inout , l’array originale viene passato, quindi in tal caso è ansible apportare modifiche su di esso.