Как гласит название, какая разница между Array vs NSArray vs [AnyObject]?
Кроме того, что наиболее рекомендуется для этого. То, что я имею в виду, рекомендуется, это самая простая реализация. Спасибо.
Как гласит название, какая разница между Array vs NSArray vs [AnyObject]?
Кроме того, что наиболее рекомендуется для этого. То, что я имею в виду, рекомендуется, это самая простая реализация. Спасибо.
Array
- struct, поэтому в Swift это тип значения.
NSArray
- неизменяемый Objective C класс, поэтому он является ссылочным типом в Swift и он привязан к 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
, как и в других ссылочных типах.
Array
представляет собой конструкцию Swift и общую структуру, что означает, что она может быть массивом любого конкретного типа (Int, String, AnyObject и т.д.)
[T]
является синтаксическим сахаром для Array<T>
AnyObject
- объект любого класса, включая классы Objective-C.
NSArray
представляет собой конструкцию Objective-C, которая может содержать любой объект Objective-C и прозрачно отображается и Array<AnyObject>
Используя ответ Крзака, вот практический пример:
// 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.