web-dev-qa-db-de.com

Unveränderliche/veränderliche Sammlungen in Swift

Ich bezog mich auf die Swift-Programmieranleitung von Apple zum Verständnis der Erstellung von veränderlichen/unveränderlichen Objekten (Array, Dictionary, Sets, Data) in Swift. Aber ich konnte nicht verstehen, wie man in Swift eine unveränderliche Sammlung erstellt. 

Ich möchte die Entsprechungen in Swift für Folgendes in Objective-C sehen

Immutable Array

NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];

Mutable Array

NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];

Unveränderliches Wörterbuch

NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];

Mutable Dictionary

NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];
76
Pranav Jaiswal

Arrays

Unveränderliches Array erstellen

Erster Weg:

let array = NSArray(array: ["First","Second","Third"])

Zweiter Weg:

let array = ["First","Second","Third"]

Veränderbares Array erstellen

var array = ["First","Second","Third"]

Objekt an Array anhängen

array.append("Forth")


Wörterbücher

Unverändertes Wörterbuch erstellen

let dictionary = ["Item 1": "description", "Item 2": "description"]

Verändertes Wörterbuch erstellen

var dictionary = ["Item 1": "description", "Item 2": "description"]

Neues Paar an Wörterbuch anhängen

dictionary["Item 3"] = "description"

 Weitere Informationen zu Apple Developer

103
nicael

Swift hat keinen Ersatz für NSArray oder die anderen Auflistungsklassen in Objective-C.

Es gibt Array- und Wörterbuchklassen, es sollte jedoch beachtet werden, dass es sich um "Werttypen" handelt, im Vergleich zu NSArray und NSDictionary, die "Objekttypen" sind.

Der Unterschied ist geringfügig, kann jedoch sehr wichtig sein, um Fehler in Edge-Fällen zu vermeiden.

In Swift erstellen Sie ein "unveränderliches" Array mit:

let hello = ["a", "b", "c"]

Und ein "veränderbares" Array mit:

var hello = ["a", "b", "c"]

Mutable Arrays können genauso wie NSMutableArray geändert werden:

var myArray = ["a", "b", "c"]

myArray.append("d") // ["a", "b", "c", "d"]

Sie können jedoch ein veränderbares Array nicht an eine Funktion übergeben:

var myArray = ["a", "b", "c"]

func addToArray(myArray: [String]) {
  myArray.append("d") // compile error
}

Der obige Code funktioniert jedoch mit einem NSMutableArray:

var myArray = ["a", "b", "c"] as NSMutableArray

func addToArray(myArray: NSMutableArray) {
  myArray.addObject("d")
}

addToArray(myArray)

myArray // ["a", "b", "c", "d"]

Sie können das Verhalten von NSMutableArray erreichen, indem Sie einen inout-Methodenparameter verwenden:

var myArray = ["a", "b", "c"]

func addToArray(inout myArray: [String]) {
  myArray.append("d")
}

addToArray(&myArray)

myArray // ["a", "b", "c", "d"]

schrieb diese Antwort 2015-08-10 neu, um das aktuelle Verhalten von Swift widerzuspiegeln.

30
Abhi Beckert

In Swift gibt es nur einen Array- und einen Dictionary-Typ. Die Veränderlichkeit hängt davon ab, wie Sie sie konstruieren:

var mutableArray = [1,2,3]
let immutableArray = [1,2,3]

das heißt, wenn Sie eine Zuweisung zu einer Variablen erstellen, ist sie veränderlich, wenn Sie jedoch eine Zuweisung zu einer Konstanten erstellen, ist dies nicht möglich.

WARNUNG: Unveränderliche Arrays sind nicht vollständig unveränderlich! Sie können immer noch ihren Inhalt ändern, nur nicht ihre Gesamtlänge!

6
ColinE

Deklarieren Sie einfach Ihr (beliebiges) Objekt oder Ihre Variable mit 

'let' key Word -> for "constan/Immutable" array, dictionary, variable, object..etc.

und

'var' key Word -> for "Mutable" array, dictionary, variable, object..etc. 

Für tiefer gehende Informationen 

Verwenden Sie let, um eine Konstante zu erstellen, und var, um eine Variable zu erstellen. Der Wert einer Konstante muss zum Zeitpunkt des Kompilierens nicht bekannt sein, Sie müssen jedoch einen Wert genau einmal zuweisen. Das bedeutet, Sie können Konstanten verwenden, um einen Wert zu benennen, den Sie einmal festgelegt haben, aber an vielen Stellen verwendet werden.

var myVariable = 42
myVariable = 50
let myConstant = 42

Lesen Sie "Die schnelle Programmiersprache".

5
iPatel

Wenn Sie mit Array (Swift) wie mit NSArray arbeiten möchten, können Sie eine einfache Bridge-Funktion verwenden. Beispiel:

var arr1 : Array = []

arr1.bridgeToObjectiveC().count

Es funktioniert genauso für let.

3
Moti F.

Von Apples eigenen Dokumenten:

Veränderlichkeit von Sammlungen

Wenn Sie ein Array, ein Set oder ein Wörterbuch erstellen und es einem .__ zuweisen. Variable ist die erstellte Sammlung veränderbar. Das heisst dass Sie die Sammlung ändern (oder mutieren) können, nachdem sie von .__ erstellt wurde. Hinzufügen, Entfernen oder Ändern von Elementen in der Sammlung. Umgekehrt, wenn Sie ordnen ein Array, eine Menge oder ein Wörterbuch einer Konstante, dem Die Sammlung ist unveränderlich und ihre Größe und ihr Inhalt können nicht geändert werden.

https://developer.Apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//Apple_ref/doc/uid/TP40014097-CH8-ID105

Andere Verwendungen von unveränderlichen/veränderbaren Sammlungen hängen davon ab, warum sie veränderbar/unveränderlich sein sollen. Sammlungen sind value - Typen in Swift. Dies bedeutet, dass ihr Inhalt kopiert wird, wenn sie einem anderen Wert zugewiesen oder an eine andere Funktion/Methode übergeben werden. Daher müssen Sie sich keine Gedanken darüber machen, ob eine Funktion der Empfangsmethode das ursprüngliche Array ändern kann. Daher müssen Sie nicht sicherstellen, dass Sie eine unveränderliche Auflistung zurückgeben, wenn Ihre Klasse beispielsweise eine veränderliche Auflistung enthält.

0
Balthazar