394 Stimmen

Wie kann ich NSMutableArray in NSArray umwandeln?

Wie konvertiere ich NSMutableArray zu NSArray in objektiv-c ?

3voto

Vikram Biwal Punkte 2318

In objective-c :

NSArray *myArray = [myMutableArray copy];

In Windeseile :

 var arr = myMutableArray as NSArray

1voto

Anton Tropashko Punkte 4907
NSArray *array = mutableArray;

Este [mutableArray copy] Antipattern ist überall im Beispielcode zu finden. Hören Sie auf, dies für wegwerfbare veränderbare Arrays zu tun, die vergänglich sind und am Ende des aktuellen Bereichs freigegeben werden.

Es gibt keine Möglichkeit, wie die Laufzeitumgebung das verschwenderische Kopieren eines veränderlichen Arrays optimieren könnte, das kurz davor ist, den Gültigkeitsbereich zu verlassen, auf 0 zu dekrementieren und endgültig zu deallokieren.

0voto

pkamb Punkte 30154

Wenn Sie ein Array über Mutability konstruieren und dann eine unveränderliche Version zurückgeben wollen, können Sie einfach das mutable Array als "NSArray" über Vererbung zurückgeben.

- (NSArray *)arrayOfStrings {
    NSMutableArray *mutableArray = [NSMutableArray array];
    mutableArray[0] = @"foo";
    mutableArray[1] = @"bar";

    return mutableArray;
}

Wenn Sie dem Aufrufer "vertrauen", dass er das (technisch noch veränderbare) Rückgabeobjekt als unveränderliches NSArray behandelt, ist dies eine günstigere Option als [mutableArray copy] .

Apple stimmt dem zu:

Um festzustellen, ob er ein empfangenes Objekt ändern kann, muss sich der Empfänger einer Nachricht auf den formalen Typ des Rückgabewerts verlassen. Wenn er zum Beispiel ein Array-Objekt empfängt, das als unveränderlich typisiert ist, es sollte nicht versuchen, es zu mutieren . Es ist keine akzeptable Programmierpraxis, anhand der Klassenzugehörigkeit zu bestimmen, ob ein Objekt veränderbar ist.

Die oben beschriebene Praxis wird hier ausführlicher erläutert:

Bewährte Praxis: Rückgabe von mutableArray.copy oder mutableArray, wenn der Rückgabetyp NSArray ist

0voto

Amr Angry Punkte 3482

Ich habe nach der Antwort in Swift 3 gesucht und diese Frage wurde als erstes Ergebnis in der Suche angezeigt und ich habe die Antwort daraus inspiriert Hier ist also der Swift 3 Code

let array: [String] = nsMutableArrayObject.copy() as! [String]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X