in Swift: Difference between Array VS NSArray VS [AnyObject]
Array
is a struct, therefore it is a value type in Swift.NSArray
is an immutable Objective C class, therefore it is a reference type in Swift and it is bridged to Array<AnyObject>
.NSMutableArray
is the mutable subclass of 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)
Prints:
( Pencil, Eraser, Pen)[Pencil, Eraser, Notebook]
Because foo
changes the local value of a
and bar
changes the reference.It will also work if you do let arr
instead of var
as with other reference types.
Array
is a Swift construct, and generic struct, which means that it can be an array of any specific type (Int, String, AnyObject, etc.)
[T]
is syntactic sugar for Array<T>
AnyObject
is an object of any class, including Objective-C classes.
NSArray
is an Objective-C construct that can hold any Objective-C object and is transparently mapped to and from Array<AnyObject>
Using the Krzak answer, here is a practical example:
// 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.