【Swift4】ArrayとNSArray・NSMutableArrayの違いまとめ【Xcode9】

2020年8月27日

Swiftの配列には大きく分けてArrayとNSArray系の2つがあります。
NSArray系にはNSArrayとNSMutableArrayの2つがあるのでSwiftで配列というとArray・NSArray・NSMutableArrayを使い分ける必要があります。

それぞれ、特徴がありますが簡単に説明すると以下のようになっています。

  1. Arrayは値渡し、NSArray系は参照渡し
  2. NSArrayは追加・削除ができない
  3. 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の中身が同じになる