ios swift data-structures collections

ios - en Swift: Diferencia entre Array VS NSArray VS



data-structures collections (3)

Usando la respuesta de Krzak, aquí hay un ejemplo práctico:

// Let´s create an Array as a struct showing alternative ways var arrStruct = ["Pencil", "Eraser", "Notebook"] // or var arrStruct: [String] = ["Pencil", "Eraser", "Notebook"] // or var arrStruct: Array = ["Pencil", "Eraser", "Notebook"] // or var arrStruct = Array(["Pencil", "Eraser", "Notebook"]) // All this alternative ways create an array as struct // Now let´s create a function that modifies this array struct func modifyArr(alternativeArr: [String]) // or func modify(alternativeArr: Array<String>) { alternativeArr[2] = "Pen" // compilation error // This won´t work. In swift >= 3.0 all func parametes are a let variable, // this means alternativeArr is defined as a let. What one has to do is // create a local variable and copy the value. var localAlternativeArr = alternativeArr // or var localAlternativeArr: [String] = alternativeArr // or var localAlternativeArr: Array = alternativeArr // now we can change it. localAlternativeArr[2] = "Pen" print(localAlternativeArr) // ["Pencil", "Eraser", "Pen"] print(alternativeArr) // ["Pencil", "Eraser", "Notebook"] } modifyArr(alternativeArr: arrStruct) print(arrStruct) // ["Pencil", "Eraser", "Notebook"] // Since the arrStruct is a struct every time we assign to another variable or // pass it as a func argument a copy is made. // Now let´s create as an NSMutableArray var arrClass: NSMutableArray = ["Pencil", "Eraser", "Notebook"] // or var arrStruct = NSMutableArray(array: ["Pencil", "Eraser", "Notebook"]) // All this create an NSMutableArray as a class // Now let´s create a function that modifies this array struct func modifyArr(alternativeArr: NSMutableArray) { alternativeArr[2] = "Pen" print(alternativeArr) // ( // Pencil, // Eraser, // Pen // ) } modifyArr(alternativeArr: arrClass) print(arrClass) // ( // Pencil, // Eraser, // Pen // ) // Since the arrClass is a class everytime we assign to another variable or // pass it as a func argument is passed by reference. Means that any change // inside modifyArr is going to change the arrClass outside. The change // is made in the same pointer.

Como dice el título, ¿cuál es la diferencia entre Array vs NSArray vs [AnyObject]?

Además, ¿cuál es la forma más recomendada de acercarse a esto? Lo que quiero decir es recomendado, ¿cuál es la implementación más fácil? Gracias.


Array es una estructura , por lo tanto, es un tipo de valor en Swift. NSArray es una clase Objective C inmutable, por lo tanto, es un tipo de referencia en Swift y está puenteado con Array<AnyObject> . NSMutableArray es la subclase mutable de NSArray .

var arr : NSMutableArray = ["Pencil", "Eraser", "Notebook"] var barr = ["Pencil", "Eraser", "Notebook"] func foo (var a : Array<String>) { a[2] = "Pen" } func bar (a : NSMutableArray) { a[2] = "Pen" } foo(barr) bar(arr) println (arr) println (barr)

Huellas dactilares:

( Pencil, Eraser, Pen ) [Pencil, Eraser, Notebook]

Porque foo cambia el valor local de a y la bar cambia la referencia. También funcionará si let arr lugar de var como con otros tipos de referencia.


Array es una construcción Swift y struct genérica, lo que significa que puede ser una matriz de cualquier tipo específico (Int, String, AnyObject, etc.)

[T] es azúcar sintáctico para Array<T>

AnyObject es un objeto de cualquier clase, incluidas las clases Objective-C.

NSArray es una construcción Objective-C que puede contener cualquier objeto Objective-C y está mapeada de forma transparente Array<AnyObject> desde Array<AnyObject>