2015-03-05 20 views
24

Như tiêu đề cho biết, sự khác biệt giữa Array vs NSArray so với [AnyObject] là gì?trong Swift: Sự khác biệt giữa mảng VS NSArray VS [AnyObject]

Ngoài ra, cách tiếp cận được đề xuất nhiều nhất là gì. Những gì tôi có nghĩa là đề nghị là, thực hiện dễ nhất là những gì. Cảm ơn bạn.

+0

này không có gì để làm với Xcode. 'Array' không phải là một loại trong chính nó, bạn cần một tham số kiểu. '[AnyObject]' giống với 'Array ', và nó là kiểu mảng dựng sẵn của Swift. 'NSArray' là kiểu lớp Objective-C. –

Trả lời

44

Array là một struct, do đó nó là một loại giá trị trong Swift. NSArray là một Mục tiêu không thể thay đổi C lớp, do đó, nó là một loại tham chiếu trong Swift và được bắc cầu đến Array<AnyObject>. NSMutableArray là lớp con có thể thay đổi của 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] 

foo thay đổi giá trị cục bộ của abar thay đổi tham chiếu. Nó cũng sẽ hoạt động nếu bạn làm let arr thay vì var như với các loại tham chiếu khác.

+0

Đối với Swift 3, các tham số var đã được gỡ bỏ, thêm dòng này vào dòng đầu tiên của foo(): 'var a = a' – tonethar

+0

Việc loại bỏ các tham số var trong Swift 3.0 là do nhầm lẫn với các kiểu tham chiếu và giá trị. (Xem [Đề xuất SE-0003] (https://github.com/apple/swift-evolution/blob/master/proposals/0003-remove-var-parameters.md)). Mã sẽ không còn biên dịch, nhưng IMO tốt nhất cho thấy sự khác biệt, vì vậy tôi sẽ giữ nó như là. – Krzak

15

Array là một cấu trúc Swift, và struct chung, có nghĩa là nó có thể là một mảng của bất kỳ loại hình cụ thể (Int, String, AnyObject, vv)

[T] là cú pháp đường cho Array<T>

AnyObject là một đối tượng của bất kỳ lớp nào, bao gồm các lớp Objective-C.

NSArray là một cấu trúc Objective-C có thể chứa bất kỳ đối tượng Objective-C và được minh bạch ánh xạ đến và đi từ Array<AnyObject>

+0

Cấu trúc NSArray không phải lúc nào cũng được ánh xạ trong suốt tới [AnyObject]. Bạn có thể chuyển đổi nó bằng cách thêm "as [anyObject]". Điều này rất hữu ích khi bạn đang sử dụng arrayByAddingObjectsFromArray() để gắn thêm một NSArray vào một cái khác. – JSWilson

0

Sử dụng câu trả lời Krzak, đây là một ví dụ thực tế:

// 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. 
Các vấn đề liên quan