在Swift中:数组VS VS NSArray VS
正如标题所说,arraysvs NSArray与[AnyObject]有什么区别?
另外,什么是最接近这个build议的方式。 我的意思是推荐的是什么是最简单的实现。 谢谢。
Array
是一个结构体 ,因此它是Swift中的一个值types 。 NSArray
是一个不可变的Objective C 类 ,因此它是Swift中的引用types ,它被桥接到Array<AnyObject>
。 NSMutableArray
是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)
打印:
( Pencil, Eraser, Pen ) [Pencil, Eraser, Notebook]
因为foo
改变了a
和bar
的局部值改变了参考。 它也可以工作,如果你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.