2016-07-14 10 views
0

Der Iterator ist für eine Klasse wandelbar:Warum sind Iteratoren in forEach für eine Struktur unveränderlich, aber für eine Klasse veränderbar?

var selections: [Selection] = [] 

class Selection { 
    var selected: Bool 

    init(selected: Bool) { 
     self.selected = selected 
    } 
} 

selections.forEach({ $0.selected = false }) // This works 

aber nicht wandelbar für eine Struktur:

var selections: [Selection] = [] 

struct Selection { 
    var selected: Bool 
} 

selections.forEach({ $0.selected = false }) // This doesn't work because $0 is immutable 
+1

Da Klassen sind * Referenztypen *. Der Iterator ist in beiden Fällen konstant. –

+0

Vergleichen [Warum sind die Eigenschaften eines unveränderlichen Objekts in Swift veränderbar?] (Http://stackoverflow.com/questions/25827643/why-are-properties-of-an-immutable-object-mutable-in-swift). –

Antwort

1

Es ist nicht wahr, dass Strukturen unveränderlich sind. Aber Sie ändern eine andere Instanz der Struktur.

Swift verschleiert die Art und Weise, wie Objekte und Strukturen behandelt werden.

Objekte sind Referenztypen, Strukturen sind Werttypen. Das bedeutet, dass beim Iterieren von Objekten ein Verweis auf das Objekt als Argument übergeben wird und das Objekt, auf das der Verweis verweist, das ursprüngliche Objekt ändert.

Strukturen sind Werttypen. Eine neue Instanz der Struktur wird als Argument übergeben. Außerdem ist es in diesem Fall konstant. Aber selbst wenn Sie dies ändern könnten, würde dies die ursprüngliche Instanz der Struktur nicht beeinflussen.

In anderen Programmiersprache ist diese unterschiedliche Ebene der Indirektion sichtbar, i. e. in Objective-C durch eine *. In Swift ist es nicht.

+2

Die * "Sie ändern dies ... aber dies wirkt sich nicht auf das Original ..." * Teil ist irreführend. Sie können '$ 0' nicht innerhalb der Schleife im Struct-Fall ändern, weil es eine Konstante ist. –

+0

Danke, dass 'struct' ein Werttyp ist meine erste Annahme, aber in [Vergleichen von Klassen und Strukturen] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//Apple_ref/doc/uid/TP40014097-CH13-ID83) es scheint nicht als ein Unterschied zwischen Klasse und Struktur aufgeführt werden. Ich habe jedoch festgestellt, dass es später auf der gleichen Seite erwähnt wird. – Manuel

+0

@MartinR Richtig, aber die Geschichte dahinter ist wichtiger. Ich werde versuchen, das zu klären. Vielen Dank! –