in Swift: Difference between Array VS NSArray VS [AnyObject]



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

另外,最推荐的解决此问题的方法是什么。我的意思是推荐的是,什么是最简单的实现。谢谢。

Array是一个

结构体,因此它是 Swift 中的值类型NSArray 是一个不可变的 Objective C ,因此它是 Swift 中的引用类型,它被桥接到 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会更改a的本地值,bar会更改引用。如果您执行let arr而不是像其他引用类型那样var,它也将起作用。

>Array是一个 Swift 构造和泛型结构,这意味着它可以是任何特定类型的数组(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.

除了@Krzak的出色答案之外,这就是为什么

print(NSArray().object(at: 1))   // Triggers an UnmanagedException

2018-11-09 11:38:08.798088-0600 AppName[38786:10497909] * 由于未捕获的异常"NSRangeException"而终止应用程序,原因:"* -[__NSArray0对象索引:]:索引 1 超出空 NSArray 的边界">

print(Array<Int>()[1])  // Halts with "Thread 1: Fatal error: Index out of range"

这种对错误的不同处理帮助我理解了差异.....e

最新更新