2014-06-08 4 views
7

Come restituire un array mutabile da una funzione?Restituzione di un array mutabile da una funzione

Ecco un breve frammento di codice per renderlo più chiaro:

var tasks = ["Mow the lawn", "Call Mom"] 
var completedTasks = ["Bake a cake"] 

func arrayAtIndex(index: Int) -> String[] { 
    if index == 0 { 
     return tasks 
    } else { 
     return completedTasks 
    } 
} 

arrayAtIndex(0).removeAtIndex(0) 
// Immutable value of type 'String[]' only has mutating members named 'removeAtIndex' 

I seguenti lavori frammento, ma devo tornare un Array, non un NSMutableArray

var tasks: NSMutableArray = ["Mow the lawn", "Call Mom"] 
var completedTasks: NSMutableArray = ["Bake a cake"] 

func arrayAtIndex(index: Int) -> NSMutableArray { 
    if index == 0 { 
     return tasks 
    } else { 
     return completedTasks 
    } 
} 

arrayAtIndex(0).removeObjectAtIndex(0) 

tasks // ["Call Mom"] 

Grazie!

risposta

2

Questo intero paradigma è scoraggiato in Swift. Gli array in rapido sono "Tipi di valore", ovvero vengono copiati ogni volta che vengono scambiati. Ciò significa che una volta passato l'array in una funzione, non è possibile che tale funzione modifichi il contenuto dell'array originale. Questo è molto più sicuro.

Che cosa si potrebbe fare è:

var newArray = arrayAtIndex(0) 
newArray.removeObjectAtIndex(0) 

ma nota che tasks non verrà modificato. sarà una copia tasks con il primo oggetto rimosso

Il motivo per cui funziona con NSMutableArray, è che NSArray e NSMutableArray vengono copiati per riferimento, in modo da fare riferimento sempre alla matrice originale se non esplicitamente copiato.

+2

Grazie per la tua risposta, ha assolutamente senso. Tuttavia, vale la pena notare che nell'intero programma, 'tasks' e' completedTasks' sono variabili di istanza (dichiarate con 'var') e sto restituendo' self.tasks' e 'self.completedTasks'. Non riesco a creare una copia dell'array restituito, rimuovere un elemento e riassegnare la variabile di istanza ad esso perché le variabili di istanza vengono trasformate come non mutabili. In che modo le variabili di istanza possono essere trasformate come non modificabili dopo essere state restituite da una funzione? – Damien