読み込み中...

Swiftで配列操作しよう!初心者向け15選の詳しい使い方とサンプルコード

Swift言語を用いた配列操作のイラスト Swift
この記事は約16分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Swift言語はAppleが開発したプログラミング言語で、iOSやmacOSなどのAppleプラットフォーム向けのアプリケーション開発に広く使用されています。

この記事を読めば、Swiftでの配列操作をマスターすることができるようになります。

初心者の方でも分かるように、配列の基本から応用、そして注意点やカスタマイズ方法まで、徹底的に解説していきます。

●Swiftの配列とは

Swiftの配列は、複数のデータを順番に格納するためのデータ構造です。

配列内の各データは「要素」と呼ばれ、0から始まる「インデックス」でアクセスすることができます。

○配列の基本的な概念

配列は複数の要素を順番に格納するためのもので、要素のデータ型は同じである必要があります。

例えば、整数の要素から成る配列や、文字列の要素から成る配列など、様々な配列を作成することができます。

○配列の宣言と初期化

配列を宣言する際には、その配列が格納するデータの型を指定する必要があります。そして、初期化により配列に初期値を与えることができます。

このコードでは、Int型の要素を持つ配列を宣言しています。

また、初期化により[1, 2, 3, 4, 5]という5つの要素を持つ配列を作成しています。

var numbers: [Int] = [1, 2, 3, 4, 5]

このコードを実行すると、numbersという名前の配列が作成され、その配列には1から5までの整数が順に格納されます。

●Swiftでの配列操作の基本

Swift言語における配列操作は、アプリケーション開発において非常に頻繁に行われます。

基本的な操作から少し複雑な操作まで、Swiftでの配列操作のノウハウをしっかり身につけることで、より効率的なコーディングが可能となります。

ここでは、その基本的な配列操作をサンプルコードを交えて紹介していきます。

○サンプルコード1:配列への要素の追加

Swiftでは、配列に新しい要素を追加するにはappendメソッドを使用します。

このメソッドを使用することで、指定した要素が配列の末尾に追加されます。

var fruits = ["apple", "banana", "cherry"]
fruits.append("orange")

このコードでは、fruitsという配列に”orange”という要素を追加しています。

実行後のfruits配列は、[“apple”, “banana”, “cherry”, “orange”]となります。

○サンプルコード2:配列からの要素の削除

配列から特定の要素を削除する場合は、remove(at:)メソッドを使用します。

このメソッドを使うことで、指定したインデックスの要素が配列から削除されます。

var numbers = [10, 20, 30, 40, 50]
numbers.remove(at: 2)

このコードでは、numbers配列の3番目の要素(インデックス2)を削除しています。

このコードを実行すると、numbers配列は[10, 20, 40, 50]となります。

○サンプルコード3:配列の要素の参照

配列の要素を参照する際は、インデックスを指定してアクセスします。

インデックスは0から始まるため、最初の要素はインデックス0、次の要素はインデックス1となります。

let animals = ["dog", "cat", "bird"]
let firstAnimal = animals[0]

このコードでは、animals配列の最初の要素を取得して、firstAnimalに代入しています。

このコードを実行すると、firstAnimalには”dog”が格納されます。

●配列の応用的な操作

Swiftの配列は単なる要素の集合ではありません。

多くの強力なメソッドが提供されており、これらを利用することで、データのソートやフィルタリングなどの高度な操作を簡単に実行できます。

ここでは、Swiftでの配列の応用的な操作を詳しく紹介します。

○サンプルコード4:配列のソート

Swiftの配列にはsorted()メソッドが用意されており、これを使うことで配列の要素を簡単にソートすることができます。

let numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
let sortedNumbers = numbers.sorted()

このコードでは、numbersという配列を昇順にソートした結果をsortedNumbersに格納しています。

sortedNumbersの内容は[1, 1, 2, 3, 3, 4, 5, 5, 6, 9]となります。

○サンプルコード5:配列のフィルタリング

配列の中から特定の条件を満たす要素だけを抽出する場合、filterメソッドを使用します。

このメソッドは、条件を満たす要素だけを新しい配列として返します。

let numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
let evenNumbers = numbers.filter { $0 % 2 == 0 }

このコードでは、偶数だけを取り出してevenNumbersに格納しています。

evenNumbersの内容は[4, 2, 6]となります。

○サンプルコード6:配列の変換(map)

Swiftの配列操作において、mapメソッドは非常に便利な機能を提供しています。

mapメソッドを使用すると、配列の各要素に対して同じ操作を適用し、その結果を新しい配列として取得することができます。

例えば、次のサンプルコードを見てみましょう。

let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = numbers.map { $0 * $0 }

このコードでは、numbersという配列の各要素を二乗し、その結果をsquaredNumbersという新しい配列に格納しています。

したがって、squaredNumbersの内容は[1, 4, 9, 16, 25]となります。

○サンプルコード7:配列の要素の検索

Swiftの配列には、要素を検索するためのfirstIndex(of:)メソッドやcontains(_:)メソッドが提供されています。

これらのメソッドを使用することで、配列内の特定の要素を効率的に検索することができます。

次に、これらのメソッドを使用したサンプルコードを見てみましょう。

let fruits = ["apple", "orange", "banana", "grape", "pear"]
if let index = fruits.firstIndex(of: "banana") {
    print("バナナは\(index)番目にあります。")
}
let containsGrape = fruits.contains("grape")

このコードでは、まずfirstIndex(of:)メソッドを使用して”banana”のインデックスを検索し、次にcontains(_:)メソッドで”grape”が配列に含まれているかどうかを確認しています。

実行すると、「バナナは2番目にあります。」と表示され、containsGrapetrueになります。

○サンプルコード8:配列の結合

Swift言語において、異なる配列同士を結合して新しい配列を作成する場面は日常的に多く見られます。

Swiftでは、簡単な構文で複数の配列を結合することが可能です。

例として、次のサンプルコードを考えてみましょう。

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]
let combinedArray = array1 + array2

このコードでは、array1array2という2つの配列を単純に+演算子を使って結合しています。

結果として、combinedArrayには[1, 2, 3, 4, 5, 6]という6つの要素が順に格納されます。

○サンプルコード9:2次元配列の操作

2次元配列は、配列の中にさらに配列が格納されている構造を指します。

Swiftでは2次元配列も簡単に操作することができます。

次のサンプルコードをご覧ください。

let matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

let firstRow = matrix[0]
let secondItemInFirstRow = matrix[0][1]

このコードでは、matrixという2次元配列を宣言しています。

matrix[0]で最初の行を取得し、さらにmatrix[0][1]で最初の行の2番目の要素を取得しています。

このように、2次元配列の要素へのアクセスは簡単な構文で行うことができます。

実行結果として、firstRowには[1, 2, 3]が、secondItemInFirstRowには2が格納されます。

○サンプルコード10:配列のスライス

Swiftでは、配列の一部を取り出して新しい配列を作成する操作を「スライス」と呼びます。

このスライス操作は、配列の特定の範囲の要素を効率的に取り扱いたい場合に非常に役立ちます。

具体的なサンプルコードを見てみましょう。

let numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
let slicedNumbers = Array(numbers[2...5])

このコードでは、numbers配列からインデックス2から5までの要素を取り出して、新しい配列slicedNumbersを作成しています。

この場合、slicedNumbersの内容は[2, 3, 4, 5]となります。

○サンプルコード11:配列の逆順操作

Swiftの配列は、要素の順序を逆にする操作もサポートしています。

これは、データを逆の順序で処理する場面や、ユーザーインターフェースでの表示順を変更する際などに有用です。

サンプルコードを参考にしてみましょう。

let originalArray = [1, 2, 3, 4, 5]
let reversedArray = Array(originalArray.reversed())

このコードを使用すると、originalArrayの内容を逆順にした新しい配列reversedArrayが作成されます。

したがって、reversedArrayの内容は[5, 4, 3, 2, 1]となります。

●配列操作の注意点と対処法

Swiftで配列を操作する際、考慮すべきいくつかの注意点とそれに対する対処法があります。

これらのポイントを把握しておくことで、エラーを未然に防ぎ、より効果的なプログラミングが可能となります。

○空の配列の取り扱い

配列が空である場合に、その配列の要素にアクセスしようとするとエラーが発生します。

このようなエラーを避けるためには、配列が空でないことを確認してから要素にアクセスするようにしましょう。

サンプルコードを参考に確認します。

let emptyArray: [Int] = []
if !emptyArray.isEmpty {
    print(emptyArray[0])  // この行は実行されません。
} else {
    print("配列は空です。")
}

このコードでは、emptyArrayが空であるかどうかをisEmptyプロパティで確認しています。

空でなければ要素にアクセスし、空であればその旨を表示しています。

○範囲外のインデックスへのアクセス

配列の範囲外のインデックスにアクセスしようとすると、ランタイムエラーが発生します。

Swiftでは、配列の要素数よりも大きなインデックスや、負のインデックスを指定することは許可されていません。

このようなエラーを避けるためには、アクセスするインデックスが配列の範囲内にあることを確認する必要があります。

サンプルコードを使って具体的な方法を見てみましょう。

let fruits = ["apple", "orange", "banana"]
if fruits.indices.contains(2) {
    print(fruits[2])  // "banana"が出力されます。
} else {
    print("インデックスが範囲外です。")
}

このコードでは、fruits配列のindicesプロパティを使用して、指定したインデックスが配列の範囲内にあるかを確認しています。

範囲内であれば要素にアクセスし、そうでなければその旨を表示しています。

●配列のカスタマイズ方法

Swiftでは、配列の操作や利用をより効率的に、また特定の目的に合わせてカスタマイズする方法が提供されています。

これにより、あなたのアプリケーションやプロジェクトに合った最適な配列の操作が可能となります。

○サンプルコード12:カスタム型の配列の操作

Swiftでは、独自のデータ型(構造体やクラスなど)を定義し、それを元にした配列を作成することができます。

ここでは、カスタム型を元にした配列の作成と操作の例を紹介します。

// カスタム型の定義
struct Book {
    var title: String
    var author: String
}

// カスタム型の配列を作成
var books: [Book] = [
    Book(title: "タイトルA", author: "著者A"),
    Book(title: "タイトルB", author: "著者B")
]

// 配列の要素を取得
let firstBook = books[0]
print(firstBook.title)  // タイトルAを出力

このコードでは、Bookというカスタム型を使ってbooksという配列を作成しています。

このようにカスタム型を利用することで、より柔軟で複雑なデータを扱うことが可能となります。

○サンプルコード13:配列の拡張(extension)

Swiftの拡張(extension)機能を利用することで、既存の配列に新しいメソッドやプロパティを追加することができます。

これにより、配列の操作をさらに便利にカスタマイズすることが可能となります。

下記のサンプルコードは、配列に新しいメソッドを追加して、その配列の要素を逆順にする例を紹介します。

extension Array {
    func reversedArray() -> [Element] {
        var newArray: [Element] = []
        for item in self {
            newArray.insert(item, at: 0)
        }
        return newArray
    }
}

let numbers = [1, 2, 3, 4, 5]
let reversedNumbers = numbers.reversedArray()
print(reversedNumbers)  // [5, 4, 3, 2, 1]を出力

このコードのextension Array部分で、既存の配列にreversedArrayメソッドを追加しています。

これを使用して、配列の要素を逆順にした新しい配列を取得できるようにしています。

○サンプルコード14:配列の操作を高速化するTips

大規模なデータセットを扱う際や、頻繁に配列操作を行う場面では、効率的なコードの書き方が求められます。

Swift言語での配列操作を高速化するためのテクニックやTipsをいくつか紹介します。

□予め配列のサイズを確保する

配列のサイズが事前にわかっている場合、reserveCapacity(_:)メソッドを使用して、必要な容量を事前に確保することで、後続の操作の際の再確保のオーバーヘッドを削減できます。

var numbers: [Int] = []
numbers.reserveCapacity(100)
for i in 1...100 {
    numbers.append(i)
}

このコードでは、0から100までの数字をnumbers配列に追加していますが、reserveCapacity(_:)を使用して、初めから容量を100に確保しています。

□高階関数の活用

Swiftの配列には、map、filter、reduceなどの高階関数が用意されています。

これらの関数は、内部的に最適化されており、多くの場合、独自にループ処理を書くよりも高速です。

let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = numbers.map { $0 * $0 }

このコードでは、map関数を使用して、各要素を2乗した新しい配列を作成しています。

このような高階関数は、内部での処理が最適化されているため、手書きのループに比べて高速に動作する可能性があります。

□不変配列の利用

可能な場所でletキーワードを使用して不変配列を利用することで、変更のオーバーヘッドを回避することができます。

let fixedNumbers = [1, 2, 3, 4, 5]

このような不変配列は、その後での要素の追加や削除ができない代わりに、一度定義された内容が変わらないため、安全かつ高速に処理を行うことができます。

Swift言語を用いた配列操作には、上記のような高速化のテクニックやTipsが数多く存在します。

コードの最適化を行う際には、具体的な状況や要件に応じて、適切な方法を選択し、効率的な配列操作を心がけることが重要です。

○サンプルコード15:配列と関数の組み合わせ

Swiftでは、関数を第一級オブジェクトとして扱うことができます。

この特性を利用して、配列と関数を組み合わせることで、より柔軟な操作や処理を実現することができます。

下記のサンプルコードは、関数を引数として受け取り、配列の各要素に適用する例です。

func applyFunction(_ numbers: [Int], function: (Int) -> Int) -> [Int] {
    return numbers.map { function($0) }
}

let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = applyFunction(numbers, function: { $0 * $0 })

このコードでは、関数applyFunctionは、配列numbersと、整数を引数にとり整数を返す関数functionを引数として受け取ります。

そして、配列の各要素に対してfunctionを適用することで、新しい配列を返しています。

まとめ

Swift言語における配列操作は、初心者から上級者まで幅広く利用される重要な技術の一つです。

本ガイドでは、配列の基本的な操作から、高度なカスタマイズ方法までを詳細に解説しました。

特に、配列の効率的な操作や高速化のTips、関数との組み合わせ方法など、実践的な内容を重点的に取り上げました。

初心者の方は、基本的な配列の操作方法や概念をしっかりと理解することからスタートし、徐々に応用的な操作やテクニックに挑戦すると良いでしょう。

一方、経験者の方は、本ガイドで紹介した高速化のTipsやカスタマイズ方法を実際の開発に活用することで、より効率的なコードの実装が可能となります。

Swiftの配列操作は、頻繁に更新されるSwiftのバージョンに応じて新しい機能が追加されることもありますので、常に最新の公式ドキュメントや情報を参照し、最新の技術動向をキャッチアップしていくことが重要です。

最後に、本ガイドが、Swiftにおける配列操作の理解やスキルアップの一助となることを心より願っています。

Swift言語でのプログラミングを楽しみながら、日々の開発をより効果的に進めていただければ幸いです。