【Swift】配列操作でよく使われるメソッドをゼロから解説

【Swift】 配列操作の便利なメソッドをゼロから解説

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

randomElementメソッドは、オプショナル型の値を返します。
値を取り出すため、オプショナルバインディングを適用しています。

配列の要素をシャッフル

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]

配列をスライスしたものは、Array型ではなくArraySlice型となります。

配列の要素を置換

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"]

reversedメソッドが返す値はReversedCollectionタイプです。

配列を昇順にソート: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

maxメソッドは、オプショナル型の値を返します。
値を取り出すため、オプショナルバインディングを適用しています。

配列の最小値:minメソッド

配列の最小値を取得するには、minメソッドを使います。

var list = [1, 2, 3, 4, 5]
if let minimumNumber = list.min() { // minメソッドは配列の最小値を取得する
    print(minimumNumber)
}
1

minメソッドは、オプショナル型の値を返します。
値を取り出すため、オプショナルバインディングを適用しています。

配列の先頭・末尾の要素を取得

ここでは、配列の先頭と末尾の要素を取得する方法を2つ紹介します。

  • 配列の先頭の要素を取得:firstメソッド
  • 配列の末尾の要素を取得:lastメソッド

配列の先頭の要素を取得:firstメソッド

配列の先頭の要素を取得するには、firstメソッドを使います。

var list = [1, 2, 3, 4, 5]
if let firstNumber = list.first { // firstメソッドは配列の先頭の要素を取得する
    print(firstNumber)
}
1

firstメソッドは、オプショナル型の値を返します。
値を取り出すため、オプショナルバインディングを適用しています。

配列の末尾の要素を取得:lastメソッド

配列の末尾の要素を取得するには、lastメソッドを使います。

var list = [1, 2, 3, 4, 5]
if let lastNumber = list.last { // lastメソッドは配列の末尾の要素を取得する
    print(lastNumber)
}
5

lastメソッドは、オプショナル型の値を返します。
値を取り出すため、オプショナルバインディングを適用しています。

条件に一致するインデックスを取得

ここでは、条件に一致するインデックスを取得する方法を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

firstIndexメソッドは、オプショナル型の値を返します。
値を取り出すため、オプショナルバインディングを適用しています。

条件に一致する要素の最後のインデックスを取得: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

lastIndexメソッドは、オプショナル型の値を返します。
値を取り出すため、オプショナルバインディングを適用しています。

まとめ

この記事では、配列操作の使い方やよく使われるメソッドについて解説しました。

  • 配列の定義
  • 配列には便利なメソッドが数多く存在する

参考文献
Swift | Apple Developer Documentation

【Swift】 配列操作の便利なメソッドをゼロから解説

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

よぴのアバター よぴ Swift / iOSエンジニア

ゼロから始めるSwift/iOSエンジニア
デザインや開発に携わる人たちと繋がって、学び合える関係を作りたいです。

▷ iOSアプリ個人開発
▷ 2022/10/01からスタート
▷ 制作過程や学んだことをブログに載せていきます

目次