【Swift4】ArrayとNSArray・NSMutableArrayの違いまとめ【Xcode9】
Swiftの配列には大きく分けてArrayとNSArray系の2つがあります。
NSArray系にはNSArrayとNSMutableArrayの2つがあるのでSwiftで配列というとArray・NSArray・NSMutableArrayを使い分ける必要があります。
それぞれ、特徴がありますが簡単に説明すると以下のようになっています。
- Arrayは値渡し、NSArray系は参照渡し
- NSArrayは追加・削除ができない
- NSMutableArrayは追加・削除が自由
あとは定義や初期化、要素の追加、削除など、細かい所にも違いがあります。
詳しくは以下をご確認ください。
配列の定義
Array
// 初期化方法1:[型]を指定して配列を宣言
var array1 : [String]
// 初期化方法2:<型>を指定して配列を宣言
var array2 : Array<Int>
NSArray・NSMutableArray
var nsArray : NSArray!
var nsmArray : NSMutableArray!
NSArray・NSMutableArrayの場合、型の指定は特になく、なんでもはいる<Any>型となっている
配列の宣言と初期化
Array
// 1~3 配列の宣言をし、空の配列を作る
var array1 : [String]
array1 = [] // 初期化(空配列)をしないとエラーになる
var array2 = [String]()
var array3 = Array<String>()
// 4 配列の宣言と同時に中身を追加して配列を作る
let array4 = ["Apple", "Google", "Facebook"]
NSArray・NSMutableArray
// 1~2 配列の宣言をし、空の配列を作る
var nsArray1 = NSArray()
var nsArray2 : NSArray = []
var nsmArray1 = NSMutableArray()
var nsmArray2 : NSMutableArray = []
// 3 配列の宣言と同時に中身を追加して配列を作る
var nsArray3 : NSArray = ["Apple", "Google", "Facebook"]
var nsmArray3 : NSMutableArray = ["Apple", "Google", "Facebook"]
配列の定義同様、配列の宣言時に型の指定は特になく、なんでもはいる<Any>型となっている
配列に要素を追加する
Array
var array = ["A", "C", "D", "E"]
// 要素を配列の最後に追加する
array.append("F")
// ["A", "C", "D", "E", "F"]になる
// 要素を配列の1番目に追加
array.insert("B", atIndex:1)
// ["A", "B", "C", "D", "E", "F"]になる
NSArray・NSMutableArray
var nsmArray : NSMutableArray = ["A", "C", "D", "E"]
// 要素を配列の最後に追加する
nsmArray.add("F")
// ["A", "C", "D", "E", "F"]になる
// 要素を配列の1番目に追加
nsmArray.insert("B", atIndex:1)
// ["A", "B", "C", "D", "E", "F"]になる
配列の最後に要素を追加する場合、Arrayのappend関数に代わりadd関数を使用する
配列の要素を削除する
Array
var array = ["A", "B", "C", "D", "E", "F"]
// 配列の最初の要素を削除
array.removeFirst()
// 配列の最後の要素を削除
array.removeLast()
// 配列の指定した要素を削除
array.remove(at: 1)
// 全てを削除
array.removeAll()
NSArray・NSMutableArray
var nsmArray : NSMutableArray = ["A", "B", "C", "D", "E", "F"]
// 配列の最後の要素を削除
nsmArray.removeLastObject()
// 配列の指定した要素を削除
nsmArray.removeObject(at: 1)
// 全てを削除
nsmArray.removeAllObjects()
Arrayと違いremoveFirst関数のようなものがない、removeObject関数を使えば同じことができるので問題はなさそう
Arrayは値渡し、NSArray系は参照渡し
Array
var array1 = ["A", "B", "C", "D", "E", "F"]
var array2 = array1
array2.remove(at: 1)
print("array1:\(array1)") // 実行結果:array1:["A", "B", "C", "D", "E", "F"]
print("array2:\(array2)") // 実行結果:array2:["A", "C", "D", "E", "F"]
値渡しなので、array1とarray2の中身が別になる
NSArray・NSMutableArray
var nsmArray1 : NSMutableArray = ["A", "B", "C", "D", "E", "F"]
var nsmArray2 : NSMutableArray = nsmArray1
nsmArray2.removeObject(at: 1)
print("nsmArray1:\(nsmArray1)") // 実行結果:nsmArray1:(A,C,D,E,F)
print("nsmArray2:\(nsmArray2)") // 実行結果:nsmArray2:(A,C,D,E,F)
参照渡しなので、nsmArray1とnsmArray2の中身が同じになる