2014-06-08 11 views
7

Jak zwrócić zmienną tablicę z funkcji?Zwracanie tablica z tablicami zmiennymi z funkcji

Oto krótki fragment kodu, aby uczynić go bardziej jasne:

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' 

następujące prace snippet ale muszę zwrócić Array, a nie 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"] 

Dzięki!

Odpowiedz

2

Ten cały paradygmat jest zniechęcony w Swift. Arrays in swift to "Typy wartości", co oznacza, że ​​są kopiowane za każdym razem, gdy są przekazywane. Oznacza to, że po przejściu tablicy do funkcji nie można zmusić tej funkcji do modyfikowania zawartości oryginalnej tablicy. To jest o wiele bezpieczniejsze.

Co można zrobić, to:

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

Należy jednak pamiętać, że tasks nie zostaną zmienione. będzie kopia tasks z pierwszego obiektu usunięte

Powodem współpracuje z NSMutableArray, jest to, że NSArray i NSMutableArray są kopiowane przez odniesienie, więc zawsze odnoszą się do oryginalnej tablicy, chyba że wyraźnie kopiowane.

+2

Dzięki za odpowiedź, to ma całkowicie sens. Warto jednak zauważyć, że w całym programie "zadania" i "zakończone zadania" są zmiennymi instancji (zadeklarowanymi za pomocą 'var') i zwracam' self.tasks' oraz 'self.completedTasks'. Nie mogę utworzyć kopii zwróconej tablicy, usunąć elementu, a następnie przypisać do niego zmienną instancji, ponieważ same zmienne instancji są przekształcane jako niemodyfikowalne. W jaki sposób można transformować zmienne instancji jako niemodyfikowalne po zwróceniu ich przez funkcję? – Damien