2016-07-15 36 views
1

Ich versuche, NSMutableArray in NSMutableArray zu speichern. SoNSMutableArray in NSMutableArray Swift

var all:NSMutableArray = NSMutableArray() 
let localArray:NSMutableArray = NSMutableArray() 
var i = 0 
for ..........{ 

    /* Add objects to localArray */ 
    localArray.addObject("1\(i)") 
    /* Add localArray to all Array */ 
    all.addObject(localArray) 
    /* Reset the array after adding to `all` array */ 
    localArray.removeAllObjects() 
    i+=1 
} 

Aber das Ergebnis: variable alle die NSMutableArray ist wird zurückgesetzt.

+0

Sie fügen mehrere Referenzen in 'all' zu einem Array hinzu und leeren es jedes Mal durch die Schleife. Probieren Sie 'print (all) 'aus, wenn Sie die Schleife verlassen, um zu sehen, was passiert. –

Antwort

2

Im Gegensatz zu Swift native Arrays (die struct s sind und somit Arten Wert), NSMutableArray s sind Objekte (Referenztypen). Wenn Sie das veränderbare Array nach dem Hinzufügen zum anderen Array löschen, löschen Sie die einzige Kopie dieses Objekts.

Wenn Sie die Erklärung von localArray zu in Ihrer Schleife bewegen, wird eine neue Instanz der Anordnung jedes Mal durch die Schleife und Sie werden das Verhalten der Sie suchen erreichen:

let all = NSMutableArray() 
var i = 0 
for ..........{ 
    let localArray = NSMutableArray() 

    /* Add objects to localArray */ 
    localArray.addObject("1\(i)") 
    /* Add localArray to all Array */ 
    all.addObject(localArray) 

    i += 1 
} 

Beachten Sie, dass Ich habe den Code entfernt, der localArray löscht, weil das nicht mehr notwendig ist, da Sie jedes Mal ein neues Array durch die Schleife erhalten.

+1

Die Verwendung von expliziten Typen wird nicht empfohlen, besser implizit zu verwenden: 'var all = NSMutableArray()'. Im Gegensatz zu Swift Arrays in NSMutableArray wird auch der Wert des Objekts nicht verändert, also kann 'all' eine' Let'Variable sein. –

+0

Vielen Dank. –

+0

Danke @VladimirNul, ich habe diese Änderungen am Code vorgenommen. – vacawama

-1
var all:NSMutableArray = NSMutableArray() 
var i = 0 
for ..........{ 
    let localArray:NSMutableArray = NSMutableArray()  
    /* Add objects to localArray */ 
    localArray.addObject("1\(i)") 
    all.addObject(localArray) 
    localArray.removeAllObjects() /* To reset the array after adding to `all` array*/ 
    i+=1 
} 

, aber ich würde empfehlen, Swift Array zu verwenden

wie so

var all = Array<Array<Type>>() 
+0

@TestO. Setzen Sie das innere Array nicht zurück. Sie speichern einen Verweis darauf in 'all', keine Kopie. Das bedeutet, dass alles, was Sie nach dem Speichern des Verweises tun, auch für das gilt, was sich in "alles" befindet. –

+0

Vielen Dank. –

Verwandte Themen