Swift optionale Array-Eigenschaft ist unveränderlich?

8

Ich konstruiere ein Array von booleschen Werten, um den Zustand der Abschnitte in einer UICollectionView zu speichern. Es ist eine Variable, die als eine Eigenschaft von meinem UIViewController gespeichert wird:

%Vor%

Dann konstruiere ich in einer von loadView () aufgerufenen Funktion das Array und weise dem ersten Index einen Wert zu:

%Vor%

Der Wert am Index 0 bleibt falsch! Das Array ist aufgebaut und hat mehrere Elemente, aber jede Zuweisung, die ich an einen Index mache, hat keine Auswirkungen auf den Wert, der in diesem Index gespeichert ist, auch wenn ich den Wert in der nächsten Codezeile überprüfe. Ich weiß, dass Swift eine Kopie eines Arrays erstellt, wenn ich eine Aktion ausführe, die seine Länge ändern kann, aber ich denke nicht, dass dies ein Fall ist, in dem eine Kopie erstellt würde. Die einzige Möglichkeit, einen Wert zu ändern, ist, wenn ich manuell eine Kopie wie folgt erstellen:

%Vor%

Vermisse ich etwas Offensichtliches oder könnte das ein seltsamer Bug sein?

    
Eric Gratta 25.06.2014, 14:21
quelle

2 Antworten

2

Um meinen Code auf SO anstatt Pastebin zu haben, hier ist meine Beobachtung. Das sieht wie eine Art Bug oder unerwartetes Verhalten aus, wenn ein optionales Array in einer Swift-Klasse verwendet wird, die von einer Objective C-Klasse abgeleitet ist. Wenn Sie eine einfache Swift-Klasse verwenden, funktioniert dies wie erwartet:

%Vor%

Wenn Sie jedoch Foo von NSObject ableiten:

%Vor%

Auch in diesem Fall, wenn Sie Ihre wocheSelektionsinitialisierung in einem Initialisierer durchführen, funktioniert es:

%Vor%

Persönlich würde ich sagen, dass dies ein Fehler ist. Ich kann nichts in irgendeiner Dokumentation sehen, die den Unterschied im Verhalten erklärt, wenn es von NSObject abgeleitet wird.

Ich kann auch nichts sehen, was sagt, dass optionale Array-Eigenschaften unveränderlich wären. Dies wäre besonders merkwürdig, wenn man bedenkt, dass "unveränderliche" Arrays tatsächlich in Swift änderbar sind, d. H. Dies:

%Vor%

... funktioniert gut und wird derzeit als gültig dokumentiert, auch wenn es ein bisschen seltsam erscheint.

Persönlich würde ich jede mögliche Problemumgehung verwenden und einen Fehler mit Apple auslösen, um zu sehen, welches Licht sie vergießen können.

    
Matt Gibson 26.06.2014, 06:29
quelle
0

Keine Erklärung, aber ein Workaround. Das Problem tritt nicht mit dem Initiator count:repeatedValue auf, sondern mit dem Array, das einer optionalen Variablen zugewiesen wird. Von dem, was ich sagen kann, können optionale Arrays nur Accessor-Methoden und keine Mutator-Methoden verwenden - effektiv sind sie unveränderlich. Wenn Sie _weekSelections vorübergehend einer nicht optionalen Variablen zuweisen, bevor Sie versuchen, den Inhalt zu ändern (und _weekSelections nach dem Zurücksetzen zuweisen), funktioniert das Programm. Bitte beachten Sie, dass dies bei Zuweisungen ein neues Array (mit den gleichen Elementen) zu erstellen scheint, so dass Speicherprobleme auftreten können, wenn das Array sehr groß ist. Natürlich funktioniert auch die Verwendung einer nicht-optionalen Variablen an erster Stelle.

Warum optionale Arrays nicht veränderbar sind, kann das ein Fehler sein oder es mag einen esoterischen Grund dafür geben, den ich nicht ergründe. Hat noch jemand eine plausibel klingende Theorie?

    
Alvin Thompson 25.06.2014 21:10
quelle