在Swift中:数组VS VS NSArray VS

正如标题所说,arraysvs NSArray与[AnyObject]有什么区别?

另外,什么是最接近这个build议的方式。 我的意思是推荐的是什么是最简单的实现。 谢谢。

Array是一个结构体 ,因此它是Swift中的一个值typesNSArray是一个不可变的Objective C ,因此它是Swift中的引用types ,它被桥接到Array<AnyObject>NSMutableArrayNSArray的可变子类。

 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) 

打印:

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

因为foo改变了abar的局部值改变了参考。 它也可以工作,如果你let arr而不是var其他参考types。

Array是一个Swift构造和generics结构,这意味着它可以是任何特定types的数组(Int,String,AnyObject等)

[T]Array<T>语法糖

AnyObject是任何类的对象,包括Objective-C类。

NSArray是一个Objective-C结构,可以容纳任何Objective-C对象,并透明地映射到Array<AnyObject>

使用Krzak答案,这里是一个实际的例子:

 // 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.