2014-10-27 8 views
8

In Swift, quando si passa un tipo di valore, dire una matrice a una funzione. Viene creata una copia dell'array per la funzione da utilizzare.Quando si esegue la copia per i tipi di valore rapido

Tuttavia la documentazione a https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-XID_134 dice anche:

La descrizione di cui sopra si riferisce alla “copia” di stringhe, array e dizionari. Il comportamento visualizzato nel codice sarà sempre come se si fosse verificata una copia . Tuttavia, Swift esegue solo una copia effettiva dietro alle scene quando è assolutamente necessario farlo. Swift gestisce tutte le copie di valore per garantire prestazioni ottimali e non è necessario evitare l'assegnazione di per tentare di impedire questa ottimizzazione.

Ciò significa che la copia viene effettivamente eseguita solo quando il tipo di valore passato viene modificato?

C'è un modo per dimostrare che questo è in realtà il comportamento sottostante?

Perché questo è importante? Se creo una grande matrice immutabile e voglio passarla dalla funzione alla funzione, di certo non voglio continuare a fare copie di essa. Dovrei semplicemente usare NSArrray in questo caso o Swift Array funzionerà bene finché non cercherò di manipolare il passato in Array?

Finché non si rendono esplicitamente modificabili le variabili nella funzione utilizzando var o inout, la funzione non può comunque modificare l'array. Quindi fa ancora una copia? Premesso che un altro thread può modificare la matrice originale altrove (solo se è mutabile), facendo una copia nel momento in cui la funzione è chiamata necessaria (ma solo se la matrice passata è mutabile). Quindi se l'array originale è immutabile e la funzione non sta usando var o inout, non c'è alcun punto in Swift che crea una copia. Destra? Che cosa significa Apple con la frase sopra?

+4

A quanto ho capito, il comportamento degli array Swift è noto come "copy on write", ovvero, Swift agirà in modo sensato, come te lo aspetti, per un array immutabile: perché non puoi scriverlo, non dovrebbe mai essere copiato. –

risposta

0

Non so se è lo stesso per ogni tipo di valore in Swift, ma per Array s sono abbastanza sicuro che sia una copia su scrittura, quindi non lo copia a meno che non lo modifichi, e come hai detto, se lo passi come costante, non corri comunque quel rischio.

p.s. In Swift 1.2 ci sono nuove API che puoi usare per implementare copy-on-write sui tuoi stessi value-types

Problemi correlati