Swiftで学ぶ!二次元配列の使い方と応用の10選

Swiftのロゴと二次元配列のイラストが一緒にデザインされた画像Swift
この記事は約16分で読めます。

 

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

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

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

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

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

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

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

はじめに

この記事を読めば、Swiftを使った二次元配列のコーディングができるようになります。

もし、あなたが「Swiftで二次元配列って何?」と思っているなら、この記事が完璧なガイドとなるでしょう。

基本的な使い方から、応用の方法、そして注意すべきポイントまでをわかりやすく解説します。

特に初心者の方に向けて、サンプルコードとその詳細な説明を交えながら進めていきます。

●Swiftとは

Swiftは、Appleが開発したプログラミング言語です。

iOS、macOS、watchOS、tvOSのアプリケーション開発に使用されています。

○Swiftの基本的な特徴

Swiftは、安全性と高速性を兼ね備えた言語として設計されています。

その結果、バグを減少させ、効率的なコーディングが可能になりました。

また、Swiftは読みやすく、明確な文法が特徴となっているため、プログラミング初心者でも比較的学びやすい言語となっています。

○Swiftでのプログラミングのメリット

Swiftでのプログラミングにはいくつかのメリットがあります。

まず、先述の通り、文法が明確で読みやすいため、コードの理解やデバッグがしやすいという点が挙げられます。

さらに、動作が高速であるため、リアルタイムなアプリケーションの開発にも適しています。

また、Appleのプラットフォームで動作するアプリケーションを開発する際の最適な言語となっています。

このような特長を持つSwiftは、今後も多くの開発者に支持されることでしょう。

●二次元配列とは

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

一次元配列が「リスト」のようなものであるとすると、二次元配列は「表」のようなイメージになります。

具体的には、行と列が存在し、それぞれの行列の交点にデータが格納されています。

○基本的な定義と使い方

Swiftでの二次元配列の定義は非常にシンプルです。

例として、3行3列の二次元配列を考えてみましょう。

この配列には、数字が格納されており、それぞれの数字は行と列のインデックスによってアクセスできます。

var array2D: [[Int]] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

このコードでは、array2Dという名前の二次元配列を定義しています。

この配列は3つの配列を含んでおり、それぞれの配列には3つの整数が格納されています。

アクセス方法も簡単です。

例えば、中央の「5」という数字にアクセスしたい場合は、次のようにします。

let centerValue = array2D[1][1]
print(centerValue)  // 結果は「5」

初めの[1]は2行目を指定しており、次の[1]は2列目を指定しています。

Swiftでは、配列のインデックスは0から始まるため、2行2列目は[1][1]となります。

○二次元配列の実際の活用例

二次元配列は、さまざまな場面で活用されます。

例えば、ゲームのマップや、エクセルのような表データの処理、画像のピクセルデータの処理など、行と列の概念が必要な場面でよく使われます。

実際の活用例として、学校のクラスの生徒の点数を管理する場面を考えてみましょう。3つのクラスがあり、それぞれのクラスには5人の生徒がいます。

この場合、3行5列の二次元配列を使用して、それぞれの生徒の点数を格納することができます。

●Swiftでの二次元配列の作り方

二次元配列は、多くのプログラムにおいて、データの構造を表現するために用いられるものです。Swiftでは、その宣言や操作が非常に簡単に行えます。

ここでは、Swiftを利用して、二次元配列の基本的な作り方を学んでいきましょう。

○初心者向け基本の作り方

Swiftで二次元配列を作成する基本的な方法は、配列の中にさらに配列を格納する形になります。

具体的な構文を見てみましょう。

□サンプルコード1:基本的な二次元配列の宣言と初期化

// 整数型の二次元配列を宣言と初期化
var numbers2D: [[Int]] = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

このコードでは、numbers2Dという二次元配列を宣言し、初期値として3×3の整数を持つ配列を与えています。

配列の要素にアクセスする場合、配列名[行のインデックス][列のインデックス]という形で指定します。

例えば、上記のnumbers2Dの中央の値5にアクセスしたい場合、numbers2D[1][1]と指定します。

□サンプルコード2:二次元配列に値を追加する

// 二次元配列に新しい行を追加する
numbers2D.append([10, 11, 12])

// 二次元配列の特定の行に新しい値を追加する
numbers2D[0].append(4)

// 追加後のnumbers2Dの内容を表示
for row in numbers2D {
    print(row)
}
// 出力結果は
// [1, 2, 3, 4]
// [4, 5, 6]
// [7, 8, 9]
// [10, 11, 12]

上のサンプルコードでは、numbers2D配列に新しい行を追加しています。

さらに、最初の行に新しい列の値を追加しています。

このように、Swiftの二次元配列は柔軟にサイズを変更することができます。

●二次元配列の詳細な使い方

Swiftの二次元配列は、多次元データを効率よく取り扱うための手段として、多くのアプリケーションで利用されています。

ここでは、二次元配列の中のデータの取り出し方や更新・削除方法を詳しく解説します。

○データの取り出し方

二次元配列の要素にアクセスする際、行と列の指定を行います。

Swiftではインデックスを用いて、簡単にデータの取得ができます。

□サンプルコード3:特定の位置のデータを取得する

var matrix: [[Int]] = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

// 2行目の3列目のデータを取得
let value = matrix[1][2]
print(value)  // 6 が出力される

このコードでは、matrixという名前の二次元配列から、2行目の3列目のデータを取得しています。

取得したデータは、valueに格納され、結果として6が出力されます。

○データの更新・削除方法

Swiftの二次元配列では、指定した位置のデータを簡単に更新したり、削除したりすることができます。

下記のサンプルコードを参考にして、具体的な操作方法を確認しましょう。

□サンプルコード4:特定の位置のデータを更新する

// 2行目の3列目のデータを10に更新
matrix[1][2] = 10
print(matrix[1])  // [4, 5, 10] が出力される

上のコードでは、2行目の3列目のデータを10に更新しています。

その結果、2行目のデータは[4, 5, 10]となります。

□サンプルコード5:特定の位置のデータを削除する

// 2行目の3列目のデータを削除
matrix[1].remove(at: 2)
print(matrix[1])  // [4, 5] が出力される

このコードを使用すると、2行目の3列目のデータが削除され、結果として2行目のデータは[4, 5]となります。

●応用例とサンプルコード

Swiftの二次元配列を活用する上で、さまざまな応用的な操作方法が考えられます。

ここでは、その中でも特に実用性の高い操作を中心に、サンプルコードを交えながら解説します。

○行と列を逆にする方法

二次元配列では、行と列を逆にすることで、新たなデータの形状を作成することができます。

例えば、3×2の二次元配列を2×3の形状に変換する方法を考えてみましょう。

□サンプルコード6:二次元配列の行と列を入れ替える

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

var transposed: [[Int]] = Array(repeating: Array(repeating: 0, count: original.count), count: original[0].count)

for i in 0..<original.count {
    for j in 0..<original[i].count {
        transposed[j][i] = original[i][j]
    }
}

print(transposed)  // [[1, 3, 5], [2, 4, 6]] と出力されます

このコードでは、初めに3×2のoriginalという二次元配列を定義しています。

次に、その行と列を入れ替えたtransposedという二次元配列を作成し、for文を使ってデータの入れ替えを行っています。

○特定の条件でデータをフィルタリングする

特定の条件を満たすデータのみを取り出す方法も、多くの場面で役立ちます。

下記のサンプルコードは、二次元配列から偶数のみを取り出しています。

□サンプルコード7:条件を満たすデータだけを取得する

var numbers: [[Int]] = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

var evenNumbers: [[Int]] = []

for row in numbers {
    let filteredRow = row.filter { $0 % 2 == 0 }
    if !filteredRow.isEmpty {
        evenNumbers.append(filteredRow)
    }
}

print(evenNumbers)  // [[2], [4, 6], [8]] と出力されます

上のコードでは、二次元配列numbersから偶数のみをフィルタリングして新しい二次元配列evenNumbersを作成しています。

○二次元配列を使った計算

二次元配列のデータを使って、特定の計算を行うこともよくあります。

例えば、全ての要素の合計を計算する方法を考えてみましょう。

□サンプルコード8:二次元配列の全データの合計を計算する

var data: [[Int]] = [
    [10, 20, 30],
    [40, 50, 60],
    [70, 80, 90]
]

var totalSum = 0

for row in data {
    for value in row {
        totalSum += value
    }
}

print(totalSum)  // 450 と出力されます

このコードは、二次元配列dataの全ての要素を合計し、その結果をtotalSumという変数に格納しています。

結果として、450という合計値が得られます。

○他のデータ構造への変換

Swiftの二次元配列は非常に便利であり、多くの場面で使用されますが、場面や要件によっては他のデータ構造へ変換することが求められることもあります。

ここでは、二次元配列を他のデータ構造、具体的には一次元配列や辞書に変換する方法を解説します。

□サンプルコード9:二次元配列を一次元配列に変換する

二次元配列の中身をすべて一次元配列に格納したい場合があります。

下記のサンプルコードは、そのような変換を行う方法を表しています。

var twoDimensionalArray: [[Int]] = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

var oneDimensionalArray: [Int] = twoDimensionalArray.flatMap { $0 }

print(oneDimensionalArray) // [1, 2, 3, 4, 5, 6, 7, 8, 9]

このコードでは、flatMapメソッドを使って二次元配列twoDimensionalArrayの各要素を一次元配列oneDimensionalArrayに変換しています。

□サンプルコード10:二次元配列を辞書に変換する

二次元配列の各行をキーと値のペアとして辞書に格納したい場合も考えられます。

下記のサンプルコードは、そのような変換を行っています。

var twoDimensionalArray: [[String]] = [
    ["apple", "りんご"],
    ["banana", "バナナ"],
    ["cherry", "さくらんぼ"]
]

var dictionary: [String: String] = [:]

for pair in twoDimensionalArray {
    if let key = pair.first, let value = pair.last {
        dictionary[key] = value
    }
}

print(dictionary) // ["apple": "りんご", "banana": "バナナ", "cherry": "さくらんぼ"]

このコードでは、二次元配列twoDimensionalArrayの各要素をキーと値のペアとして辞書dictionaryに格納しています。

キーと値は、配列の最初と最後の要素として扱われます。

●注意点と対処法

Swiftで二次元配列を扱う上での注意点と、それに関連する問題の対処法を解説します。

正しくかつ効率的に二次元配列を利用するための知識を身につけて、プログラムのバグや非効率な動作を避けるための手助けとしてください。

○データの範囲を超えたアクセスについて

Swiftの配列において、存在しないインデックスへのアクセスはランタイムエラーを引き起こします。

このようなエラーは、プログラムの安定性を損なう要因となります。

例えば、次のようなコードを考えます。

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

print(array[2][0])  // 存在しないインデックス

このコードを実行すると、存在しないインデックスへのアクセスのためエラーとなります。

対策として、indicesを利用して配列のインデックスが有効かどうかを事前に確認する方法があります。

if array.indices.contains(2) {
    print(array[2][0])
} else {
    print("指定されたインデックスは存在しません。")
}

このコードでは、indicesを使ってインデックスの範囲をチェックしています。

これにより、不正なインデックスアクセスを防ぐことができます。

○データ型の不一致に関する問題とその解決方法

Swiftは静的型付け言語であるため、異なるデータ型を持つ値を同じ配列に格納することは基本的には許容されません。

しかし、何らかの理由で異なる型のデータが混在する可能性がある場合は、注意が必要です。

考えられるケースとして、Any型を利用した二次元配列の場合が挙げられます。

var mixedArray: [[Any]] = [
    [1, "apple", 3],
    [4, 5, "banana"]
]

if let number = mixedArray[0][1] as? Int {
    print("数値:\(number)")
} else {
    print("数値ではありません。")
}

このコードでは、as?を使ってダウンキャストを試み、数値かどうかを確認しています。

このように型の確認や変換を行う際には、安全な方法でキャストを試みることが重要です。

●カスタマイズ方法

Swiftの二次元配列は、高度なカスタマイズが可能です。

これにより、より柔軟なプログラミングが実現できます。

今回は、二次元配列のサイズや容量の調整方法、およびカスタムデータ型を利用した二次元配列の作成方法について詳しく説明します。

○二次元配列のサイズや容量の調整

Swiftでの二次元配列のサイズや容量の調整は、一次元配列と同様に行うことができます。

しかし、外部配列と内部配列の両方を考慮する必要があります。

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

// 外部配列のサイズを増やす
numbers.append([7, 8, 9])

// 内部配列のサイズを増やす
numbers[0].append(10)

print(numbers)  // [[1, 2, 3, 10], [4, 5, 6], [7, 8, 9]]

このコードでは、外部配列に新しい内部配列を追加することでサイズを増やしています。

また、内部配列に新しい要素を追加することでサイズを増やしています。

このように、外部と内部の両方の配列にアクセスして調整することが可能です。

○カスタムデータ型を利用した二次元配列の作成

Swiftの強力な型システムを利用して、カスタムデータ型を二次元配列に格納することができます。

これにより、構造体やクラスを元にした複雑なデータ構造の管理が容易になります。

例として、学生の情報を格納する構造体を考えてみましょう。

struct Student {
    var name: String
    var score: Int
}

var classroom: [[Student]] = []

let student1 = Student(name: "田中", score: 90)
let student2 = Student(name: "山田", score: 85)

classroom.append([student1, student2])

print(classroom[0][0].name)  // 田中

このコードでは、Studentという構造体を定義し、その型の二次元配列を作成しています。

カスタムデータ型を用いることで、より詳細な情報を格納し、取り扱うことが可能となります。

まとめ

Swiftの二次元配列は、多彩なデータ構造を簡単に表現できる強力なツールです。

この記事を通じて、基本的な作り方から応用例、注意点、そしてカスタマイズ方法まで、幅広くSwiftの二次元配列について学ぶことができたかと思います。

特に、Swiftの型安全性やカスタムデータ型を利用することで、より柔軟で堅牢なプログラムを作成することが可能です。

初心者の方も、本記事のサンプルコードや詳細な説明を参考にしながら、二次元配列を効果的に活用してみてください。

今回学んだ知識を土台として、さらに高度なテクニックや応用例を追求することで、Swiftの世界をより深く探求してみることをお勧めします。