Swiftには、他のプログラミング言語同様に、配列操作に関する便利なメソッドが存在します。
この記事では、筆者が疑問に感じた
- Swiftの配列ってどうやって定義するの?
- Swiftに用意されている配列操作のメソッドにはどんなものがあるの?
をもとに配列操作に関する便利な使い方をゼロからまとめてみました。
配列操作のメソッドを一覧でまとめているので、ぜひ参考にしてみてください。
Swiftの配列の定義
Swiftでは以下のように配列を定義します。
基本的な配列の定義
/// 配列の定義
/// 変数名: [型名] = [要素1, 要素2, ...]
var list: [Int] = [1, 2, 3]
また、型を指定せずSwiftに推論させて配列を定義する方法もあります。
/// 配列の定義(型推論を用いた場合)
/// 変数名 = [要素1, 要素2, ...]
var list = [1, 2, 3]
二次元配列
二次元配列を扱うには以下のように配列を定義します。
/// 二次元配列の定義
/// 変数名: [[型名]] = [[要素1, 要素2, ...], [要素n, 要素n+1, ...], ...]
var list: [[Int]] = [[1, 2, 3], [4, 5]]
配列操作のメソッドや便利な使い方
Swiftの配列操作に関するメソッドや便利な使い方を一挙に紹介します。
以下の項目を順番に取り上げて、配列操作の使い方とコード例を1つずつ解説していきます。
- 配列の結合
- for文を使った配列操作
- 要素の追加
- 要素の削除
- 条件に一致する要素が含まれるかを判定
- 配列からランダムに要素を取得
- 配列の要素をシャッフル
- 配列の範囲を指定して部分配列を取得
- 配列の要素を置換
- 配列を同じ値で初期化
- 配列をフィルタリングして新しい配列を取得
- 配列のマッピング
- 配列の要素全体から累積値を取得
- 配列のソート
- 配列の最大値・最小値
- 配列の先頭・末尾の要素を取得
- 配列の先頭・末尾のインデックスを取得
それでは、順番に見ていきましょう。
配列の結合
配列を結合するには、+オペレータを使用します。
var list = [1, 2, 3]
list += [4, 5] // list = list + [4, 5]と同義
print(list)
[1, 2, 3, 4, 5]
もう1つ例を見ていきましょう。
以下の例では、2つの配列を宣言した後に、+オペレータで結合しています。
var list1 = [1, 2, 3]
var list2 = [4, 5]
var final = list1 + list2 // +オペレータで配列を結合
print(final)
[1, 2, 3, 4, 5]
for文を使った配列操作
配列の要素は、for-in構文で1つずつ変数に格納し、コードブロックで処理することが可能です。
let list = [1, 2, 3, 4, 5]
var total = 0
for value in list { // for-in構文で配列の要素を取得できる
total += value
}
print(total)
15
次の例は、先ほどと同じfor-in構文ですが、配列のインデックスと要素を同時に取得できる点が違います。
let list = ["a", "b", "c"]
var message = ""
for (index, value) in list.enumerated() { // for-in構文でインデックスと要素を同時に取得
message += "\(index): \(value)\n"
}
print(message)
0: a
1: b
2: c
配列の要素を追加
ここでは、配列の要素を追加する方法を2つ紹介します。
- 配列の要素を末尾に追加:appendメソッド
- 配列の要素を指定の位置に挿入:insertメソッド
配列の要素を末尾に追加:appendメソッド
配列の要素を末尾に追加するには、appendメソッドを使います。
appendの引数に追加したい値を渡すことで、配列に値を追加できます。
var list = ["a", "b", "c"]
list.append("d") // appendメソッドは配列の末尾に値を追加する
print(list)
["a", "b", "c", "d"]
配列の要素を指定の位置に挿入:insertメソッド
配列の要素を指定の位置に挿入するには、insertメソッドを使います。
insertの引数に挿入したい値と挿入位置を渡すことで、配列に値を追加できます。
var list = ["a", "c", "d"]
list.insert("b", at: 1) // insertメソッドは配列に追加したい値を指定の位置に挿入する
print(list)
["a", "b", "c", "d"]
次の例は、先ほどと同じinsertメソッドですが、挿入する対象が配列である部分が異なります。
insertの引数に挿入したい配列と挿入位置を渡すことで、配列に値を追加できます。
var list = ["a", "d"]
list.insert(contentsOf: ["b", "c"], at: 1) // insertメソッドの引数contentsOfに配列をセットすると、指定の位置に配列の要素を挿入する
print(list)
["a", "b", "c", "d"]
配列の要素を削除
ここでは、配列の要素を削除する方法を5つ紹介します。
- 空配列で要素を削除
- 配列の先頭の要素を削除:removeFirstメソッド
- 配列の末尾の要素を削除:removeLastメソッド
- 条件に一致する要素を削除:removeAllメソッド
- 配列の範囲を指定して要素を削除:removeSubrangeメソッド
空配列で要素を削除
すでに宣言した配列の変数に対して、空配列を割り当てることで要素を削除することができます。
var list = [1, 2, 3]
list = [] // 空配列を変数listに再割り当てすることで、要素を削除する
print(list)
[]
配列の先頭の要素を削除:removeFirstメソッド
配列の先頭の要素を削除するには、removeFirstメソッドを使います。
var list = [1, 2, 3, 4, 5]
list.removeFirst() // removeFirstメソッドで配列の先頭の要素を削除
print(list)
[2, 3, 4, 5]
配列の末尾の要素を削除:removeLastメソッド
配列の末尾の要素を削除するには、removeLastメソッドを使います。
var list = [1, 2, 3, 4, 5]
list.removeLast() // removeLastメソッドで配列の末尾の要素を削除
print(list)
[1, 2, 3, 4]
条件に一致する要素を削除:removeAllメソッド
条件に一致する要素を削除するには、removeAllメソッドを使います。
removeAllの引数whereにクロージャを指定することで、条件に一致する要素のみ削除できます。
var list = ["a", "b", "c", "b"]
list.removeAll(where: { (value) in // removeAllメソッドの引数whereにクロージャを指定することで、条件に一致する要素を削除する
value == "b"
})
print(list)
["a", "c"]
配列の範囲を指定して要素を削除:removeSubrangeメソッド
配列の範囲を指定して要素を削除するには、removeSubrangeメソッドを使います。
removeSubrangeの引数にインデックス範囲を指定することで、指定したインデックス範囲の要素のみ削除できます。
var list = [1, 2, 3, 4, 5]
list.removeSubrange(1...3) // removeSubrangeメソッドの引数にインデックス範囲を指定して配列の要素を削除
print(list)
[1, 5]
条件に一致する要素が含まれるかを判定
containsメソッド
条件に一致する要素が含まれるか判定するには、containsメソッドを使います。
containsの引数whereにクロージャを指定することで、クロージャの条件に一致する要素があればtrueを返します。
var list = [1, 2, 3, 4, 5]
let isFound = list.contains(where: { (value) in // containsメソッドの引数whereにクロージャを指定することで、条件に一致する要素が含まれているか判定
value > 3
})
print(isFound)
true
配列からランダムに要素を取得
randomElementメソッド
配列からランダムに要素を取得するには、randomElementメソッドを使います。
var list = ["a", "b", "c"]
if let randomValue = list.randomElement() { // randomElementメソッドは配列からランダムに要素を取得する
print(randomValue)
}
b
配列の要素をシャッフル
shuffledメソッド
配列の要素をシャッフルするには、shuffledメソッドを使います。
var list = ["a", "b", "c"]
let shuffled_list = list.shuffled() // shuffledメソッドは要素の順番をシャッフルした配列を生成する
print(shuffled_list)
["c", "a", "b"]
配列の範囲を指定して部分配列を取得
配列の範囲を指定して部分配列を取得するには、配列に対してインデックス範囲を指定します。
var numbers = [1, 2, 3, 4, 5]
var someNumbers = numbers[0..<2] // 範囲を指定してArraySlice型の部分配列を取得
var newArray = Array(someNumbers)
print(newArray)
[1, 2]
配列の要素を置換
replaceSubrangeメソッド
配列の要素を置換するには、replaceSubrangeメソッドを使います。
replaceSubrangeの引数にインデックス範囲と置換したい要素を指定することで、配列の要素を置換できます。
var list = [1, 2, 3, 4, 5]
list.replaceSubrange(0..<2, with: [5, 4]) // replaceSubrangeメソッドは範囲を指定して配列の要素を置換する
print(list)
[5, 4, 3, 4, 5]
配列を同じ値で初期化
Arrayデータタイプには、固定値で初期化するイニシャライザがあります。
var list = Array(repeating: 0, count: 5) // Arrayデータタイプは固定値で初期化することができる
print(list)
[0, 0, 0, 0, 0]
配列をフィルタリングして新しい配列を取得
filterメソッド
配列をフィルタリングして新しい配列を取得するには、filterメソッドを使います。
filterの引数にクロージャを指定することで、クロージャの条件でフィルタリングした新しい配列を取得できます。
var list = ["a", "b", "c", "d", "e"]
var filteredList = list.filter({ (value) in // filterメソッドの引数にクロージャを指定して、配列をフィルタリング
value != "b"
})
print(filteredList)
["a", "c", "d", "e"]
配列のマッピング
mapメソッド
配列をマッピングするには、mapメソッドを使います。
mapの引数にクロージャを指定することで、配列の各要素に対してマッピングできます。
var list = [1, 2, 3, 4, 5]
var double = list.map({ (value) in //mapメソッドの引数にクロージャを指定して、配列の各要素をマッピング
value * 2
})
print(double)
[2, 4, 6, 8, 10]
配列の要素全体から累積値を取得
reduceメソッド
配列の要素全体から累積値を取得するには、reduceメソッドを使います。
reduceの引数に初期値とクロージャを指定することで、配列の要素全体から累積値を取得できます。
var list = [1, 2, 3, 4, 5]
let total = list.reduce(0, { $0 + $1 }) // reduceメソッドに初期値とクロージャを指定して、配列の要素全体の累積値を取得する
print(total)
15
配列のソート
ここでは、配列をソートする方法を3つ紹介します。
- 配列の順序を反転:reversedメソッド
- 配列を昇順にソート:sortedメソッド
- 配列を降順にソート:sortedメソッド
配列の順序を反転:reversedメソッド
配列の順序を反転するには、reversedメソッドを使います。
var list = ["a", "b", "c"]
let reversedList = list.reversed() // reversedメソッドは配列の順序を反転する
let newArray = Array(reversedList) // reversedメソッドが返す値はReversedCollectionタイプなので、Arrayでキャスト
print(newArray)
["c", "b", "a"]
配列を昇順にソート:sortedメソッド
配列を昇順にソートするには、sortedメソッドを使います。
var list = ["b", "a", "c"]
let sortedList = list.sorted() // sortedメソッドは配列を昇順にソートする
print(sortedList)
["a", "b", "c"]
配列を降順にソート:sortedメソッド
配列を降順にソートするには、sortedメソッドを使います。
sortedの引数byにオペレータ>を指定することで、配列を降順にソートできます。
var list = ["b", "a", "c"]
let sortedList = list.sorted(by: >) // sortedメソッドの引数byに>オペレータを指定すると、配列を降順にソートする
print(sortedList)
["c", "b", "a"]
配列の最大値・最小値
ここでは、配列の最大値と最小値を取得する方法を2つ紹介します。
- 配列の最大値:maxメソッド
- 配列の最小値:minメソッド
配列の最大値:maxメソッド
配列の最大値を取得するには、maxメソッドを使います。
var list = [1, 2, 3, 4, 5]
if let maximumNumber = list.max() { // maxメソッドは配列の最大値を取得する
print(maximumNumber)
}
5
配列の最小値:minメソッド
配列の最小値を取得するには、minメソッドを使います。
var list = [1, 2, 3, 4, 5]
if let minimumNumber = list.min() { // minメソッドは配列の最小値を取得する
print(minimumNumber)
}
1
配列の先頭・末尾の要素を取得
ここでは、配列の先頭と末尾の要素を取得する方法を2つ紹介します。
- 配列の先頭の要素を取得:firstメソッド
- 配列の末尾の要素を取得:lastメソッド
配列の先頭の要素を取得:firstメソッド
配列の先頭の要素を取得するには、firstメソッドを使います。
var list = [1, 2, 3, 4, 5]
if let firstNumber = list.first { // firstメソッドは配列の先頭の要素を取得する
print(firstNumber)
}
1
配列の末尾の要素を取得:lastメソッド
配列の末尾の要素を取得するには、lastメソッドを使います。
var list = [1, 2, 3, 4, 5]
if let lastNumber = list.last { // lastメソッドは配列の末尾の要素を取得する
print(lastNumber)
}
5
条件に一致するインデックスを取得
ここでは、条件に一致するインデックスを取得する方法を2つ紹介します。
- 条件に一致する要素の最初のインデックスを取得:firstIndexメソッド
- 条件に一致する要素の最後のインデックスを取得:lastIndexメソッド
条件に一致する要素の最初のインデックスを取得:firstIndexメソッド
条件に一致する要素の最初のインデックスを取得するには、firstIndexメソッドを使います。
firstIndexの引数ofにインデックスを取得したい要素を指定することで、条件に一致する要素の最初のインデックスを取得できます。
var list = [1, 2, 3, 2, 1]
if let first = list.firstIndex(of: 1) { // firstIndexメソッドの引数ofに値を指定すると、値に一致する要素の最初のインデックスを取得する
print(first)
}
0
次の例では、同じfirstIndexですが、引数ofではなく引数whereを使っている点が異なります。
firstIndexの引数whereにクロージャを指定することで、クロージャの条件に一致する要素の最初のインデックスを取得できます。
var list = [1, 2, 3, 2, 1]
if let first = list.firstIndex(where: { $0 > 1 }) { // firstIndexメソッドの引数whereにクロージャを指定すると、条件に一致する要素の最初のインデックスを取得する
print(first)
}
1
条件に一致する要素の最後のインデックスを取得:lastIndexメソッド
条件に一致する要素の最後のインデックスを取得するには、lastIndexメソッドを使います。
lastIndexの引数ofにインデックスを取得したい要素を指定することで、条件に一致する要素の最後のインデックスを取得できます。
var list = [1, 2, 3, 2, 1]
if let last = list.lastIndex(of: 1) { // lastIndexメソッドの引数ofに値を指定すると、値に一致する要素の最後のインデックスを取得する
print(last)
}
4
次の例では、同じlastIndexですが、引数ofではなく引数whereを使っている点が異なります。
lastIndexの引数whereにクロージャを指定することで、クロージャの条件に一致する要素の最後のインデックスを取得できます。
var list = [1, 2, 3, 2, 1]
if let last = list.lastIndex(where: { $0 > 1 }) { // lastIndexメソッドの引数whereにクロージャを指定すると、条件に一致する要素の最後のインデックスを取得する
print(last)
}
3
まとめ
この記事では、配列操作の使い方やよく使われるメソッドについて解説しました。
- 配列の定義
- 配列には便利なメソッドが数多く存在する