[Swift]「配列」

iOSアプリ開発において、効率的なデータ管理と処理に、配列を使用します。

この記事では、配列の作成や要素の追加方法、検索・ソート・フィルタリングのテクニック、効率的なデータ操作など、基礎から応用まで解説します。

目次

配列の基礎

配列は、複数の値を一つのデータ構造として管理するためのものです。

まずは、空の配列を作成することから始めます。

配列の作成

空の配列の作成
var myArray: [Int] = []
  • myArrayという名前の空の配列を宣言しています。
  • [Int]は、配列が整数型の要素を持つことを示しています。もちろん、他のデータ型(文字列、浮動小数点数など)を使うこともできます。

要素を追加

次に、配列要素を追加する方法を見ていきましょう。以下のコードを使って、配列に要素を追加してみましょう。

配列に要素を追加
myArray.append(10)
myArray.append(20)
myArray.append(30)
  • appendメソッドを使って要素を配列に追加しています。
  • 順番に10、20、30を追加しています。

要素にアクセス

まず、配列の要素にアクセスする方法を見ていきましょう。配列の要素には、インデックスを使ってアクセスします。以下のコードを見てみましょう。

配列の要素にアクセスする方法
let myArray = [10, 20, 30, 40, 50]
let firstElement = myArray[0]
let thirdElement = myArray[2]
  • myArrayという名前の配列を作成し、0番目の要素(10)と2番目の要素(30)を取得しています。
  • 配列のインデックスは0から始まるため、0番目の要素を取得するには[0]と指定します。

さらに、範囲演算子を使って複数の要素にアクセスすることもできます。以下のコードを見てみましょう。

範囲演算子を使って複数の要素にアクセス
let myArray = [10, 20, 30, 40, 50]
let subArray = myArray[1...3]
  • myArrayから1番目の要素から3番目の要素までを取得しています。
  • 範囲演算子を使って、取得したい要素の範囲を指定します。

要素の値を変更

次に、配列の要素の値を変更する方法を見ていきましょう。配列の要素の値を変更するには、インデックスを指定して代入します。以下のコードを見てみましょう。

配列の要素の値を変更する方法
var myArray = [10, 20, 30, 40, 50]
myArray[1] = 25
myArray[3] = 45
  • myArrayの1番目の要素の値を25に、3番目の要素の値を45に変更しています。
  • 配列の要素は可変性があり、代入によって値を変更することができます。

要素をソート

次に、配列の要素をソートする方法を見ていきましょう。Swiftでは、配列をソートするためにさまざまな方法が用意されています。以下のコードを見てみましょう。

配列の要素をソート(昇順)する方法
var myArray = [5, 2, 8, 1, 9]
myArray.sort()
  • このコードは、myArrayという名前の整数の配列を作成し、その配列をソートしています。
  • sort()メソッドは元の配列を直接変更し、昇順にソートされます。
  • つまり、myArrayの値は次のようになります: [1, 2, 5, 8, 9]

sort()メソッドは配列自体を変更するため、注意が必要です。

配列の要素をソート(降順)する方法
var myArray = [5, 2, 8, 1, 9]
myArray = myArray.sorted().reversed()
  • このコードは、まずmyArrayという名前の整数の配列を作成します。
  • sorted()メソッドは配列をソートして新しい配列を返しreversed()メソッドは配列を逆順にした新しい配列を返します。つまり、最終的な操作は新しい配列を作成して元の配列の順序を逆にしたものです。
  • myArrayの値は次のようになります: [9, 8, 5, 2, 1]

これらは、配列の要素へのアクセス変更方法の一部です。Swiftの配列では、インデックス範囲演算子を使って、柔軟に要素にアクセスしたり値を変更したりすることができます。これらの操作をマスターして、効果的なデータの管理を行いましょう。

配列の応用

配列の検索とフィルタリング

ここでは、配列内の要素を検索したり、条件に基づいて配列をフィルタリングしたりする方法を解説します。

まず、配列内の要素を検索する方法を見ていきましょう。
Swiftでは、配列の要素をループして順番に検索する線形探索が基本的な手法です。

配列の検索:線形探索
let myArray = [10, 20, 30, 40, 50]
let target = 30
var foundIndex: Int?

for (index, element) in myArray.enumerated() {
    if element == target {
        foundIndex = index
        break
    }
}

if let index = foundIndex {
    print("要素が見つかりました。インデックスは\(index)です。")
} else {
    print("要素が見つかりませんでした。")
}

//出力結果:
要素が見つかりました。インデックスは2です。
  1. let myArray = [10, 20, 30, 40, 50]
    整数の配列を作成しています。この配列は [10, 20, 30, 40, 50] という要素を持ちます。
  2. let target = 30
    探したい要素の値を指定しています。ここでは target 変数に 30 を代入しています。
  3. var foundIndex: Int?
    見つかった要素のインデックスを保存する変数です。初期値は nil です。
  4. for (index, element) in myArray.enumerated()
    myArray 配列の要素とそのインデックスに対してループを行います。

enumerated() メソッドは、要素とそのインデックスのタプルを返します。

  1. if element == target
    各要素と target を比較しています。もし要素が target と一致する場合、以下の処理を行います。
    • foundIndex = index:見つかった要素のインデックスを foundIndex 変数に代入します。
    • break:要素が見つかったら、ループを中断します。以降の要素の比較は不要です。
  2. if let index = foundIndex
    foundIndex 変数に値がある場合(要素が見つかった場合)、以下を表示します。print("要素が見つかりました。インデックスは\(index)です。")
  3. else:要素が見つからなかった場合、以下を表示します。
    print("要素が見つかりませんでした。")

要素のフィルタリング

次に、配列のフィルタリングについて見ていきましょう。Swiftでは、配列の要素を特定の条件に基づいてフィルタリングすることができます。以下のコードを見てみましょう。

配列のフィルタリング
let myArray = [10, 20, 30, 40, 50]
let filteredArray = myArray.filter { $0 > 30 }

print(filteredArray) 

//出力結果:
[40, 50]
  1. let myArray = [10, 20, 30, 40, 50]
    整数型の配列myArrayを作成して、要素を10, 20, 30, 40, 50と初期化しています。
  2. let filteredArray = myArray.filter { $0 > 30 }
    filterメソッドを使用して、myArrayの要素をフィルタリングして新しい配列filteredArrayを作成しています。

filterメソッドは、与えられたクロージャ(無名関数)がtrueを返す要素だけを選別します。

  1. ここでは、クロージャ{ $0 > 30 }は要素が30より大きいかどうかを評価するものです。
  2. したがって、filteredArrayには30より大きい要素(40と50)だけが含まれます。
  3. print(filteredArray)
    filteredArrayの要素を表示します。この行が実行されると、コンソールに[40, 50]と表示されます。

配列の結合と分割

Swiftにおける配列の結合と分割について、解説します。

配列の結合

まず、配列の結合について見ていきましょう。Swiftでは、+演算子を使って複数の配列を結合することができます。以下のコードを見てみましょう。

配列の結合
let array1 = [1, 2, 3]
let array2 = [4, 5, 6]
let combinedArray = array1 + array2

print(combinedArray) 

//出力結果:
[1, 2, 3, 4, 5, 6]
  • array1array2という2つの配列を+演算子で結合しています。
  • 結合結果はcombinedArrayに格納され、1つの配列として表示されます。

配列の分割

次に、配列の分割について見ていきましょう。Swiftでは、prefix(_:)suffix(_:)メソッドを使って配列を分割することができます。以下のコードを見てみましょう。

配列の分割
let array = [1, 2, 3, 4, 5, 6]
let prefixArray = array.prefix(3)
let suffixArray = array.suffix(3)

print(prefixArray) 
//出力結果: [1, 2, 3]

print(suffixArray)  
//出力結果: [4, 5, 6]
  • prefix(3)メソッドを使って先頭から3つの要素を取り出しています。
  • suffix(3)メソッドを使って末尾から3つの要素を取り出しています。
  • それぞれの結果はprefixArraysuffixArrayに格納され、分割された配列として表示されます。

配列の反復処理と高度なループ制御方法

Swiftにおける配列の要素を反復処理する方法や、高度なループ制御方法について解説します。

配列の反復処理

まず、for-inループによる配列の反復処理について見ていきましょう。以下のコードを見てみます。

配列の反復処理
let myArray = [1, 2, 3, 4, 5]
for element in myArray {
    print(element)
}

//出力結果:
1
2
3
4
5
  • myArrayという配列をfor-inループを使って反復処理しています。
  • ループ内のelementには配列の各要素が順番に代入され、処理が実行されます。
  • この例では、各要素を単純に表示しています。

高度なループ制御方法

次に、高階関数を使った配列の処理方法について見ていきましょう。

高階関数は、配列を処理するための便利な関数です。例えば、map関数を使って各要素に処理を適用し、新しい配列を作成することができます。以下のコードを見てみます。

高度なループ制御方法:map
let myArray = [1, 2, 3, 4, 5]
let doubledArray = myArray.map { $0 * 2 }

print(doubledArray) 

//出力結果:
[2, 4, 6, 8, 10]
  • let myArray = [1, 2, 3, 4, 5]
    整数を要素とする配列 myArray を定義しています。この配列は [1, 2, 3, 4, 5] の要素を持っています。
  • let doubledArray = myArray.map { $0 * 2 }
    map 関数を使用して、myArray の各要素に対してクロージャ(無名関数) { $0 * 2 } を適用し、その結果を新しい配列 doubledArray に格納しています。
    このクロージャは要素を2倍する操作を行います。
  • print(doubledArray)
    新しい配列 doubledArrayprint 関数を使ってコンソールに出力しています。この行により、元の配列の各要素が2倍された値が出力されます。

map 関数を使用することで、元の配列の各要素に対して特定の操作を行った結果を新しい配列として簡単に生成できます。

二次元配列と多次元配列

Swiftにおける二次元配列多次元配列の作成方法や利用法について解説します。

二次元配列

まず、二次元配列の作成方法について見ていきましょう。

二次元配列の作成方法
var matrix: [[Int]] = [[1, 2, 3],
                       [4, 5, 6],
                       [7, 8, 9]]

print(matrix)

//出力結果:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
  • matrixという名前の二次元配列を作成しています。
  • 各要素は配列であり、行と列の形式で値を格納しています。この例では、3×3の行列が作成されています。

次に、二次元配列の要素へのアクセスや操作について見ていきましょう。

二次元配列の要素へのアクセスや操作方法
var matrix: [[Int]] = [[1, 2, 3],
                       [4, 5, 6],
                       [7, 8, 9]]

let element = matrix[1][2]
print(element)  
//出力結果:
6

matrix[0][1] = 10
print(matrix)
//出力結果:
[[1, 10, 3], [4, 5, 6], [7, 8, 9]]
  • matrix[1][2]は、2次元配列の1行目(インデックス1)の2列目(インデックス2)の要素を示します。
  • つまり、行列内の2行目の3列目の要素である数字6が取得され、print(element)によって出力されます。
  • matrix[0][1] = 10は、1行目(インデックス0)の2列目(インデックス1)の要素を10に変更しています。
  • その結果、行列の1行目の2列目の要素が元の2から10に変更されます。
  • その後、print(matrix)によって変更後の行列が出力されます。
  • 結果として、行列の1行目の2列目が10に変更されたことが確認できます。

多次元配列

さらに、多次元配列も同様の方法で作成や操作ができます。二次元配列の例を拡張して、3次元配列を作成するコードを以下に示します。

三次元配列の作成方法
var cube: [[[Int]]] = [[[1, 2], [3, 4]],
                        [[5, 6], [7, 8]],
                        [[9, 10], [11, 12]]]

let element = cube[1][0][1]
print(element) 
//出力結果:
6

cube[0][1][0] = 10
print(cube)
//出力結果:
[[[1, 2], [10, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]]

var cube: [[[Int]]] =

  • ここで、cubeという3次元配列が定義されています。
  • この配列は3つの次元を持ち、各次元ごとに要素を格納しています。
  • 例えば、cube[0]は1つ目の次元(Z軸)の要素を表し、それは[[1, 2], [3, 4]]という2次元配列です。
  • 同様に、cube[1]cube[2]も2次元配列を格納しています。

let element = cube[1][0][1]

  • この部分では、cube[1][0][1]という指定で、cubeの中から6を取得しています。
  • ここでのインデックス指定は、次元ごとに指定されており、[1][0][1]は次のように対応しています:
  • cube[1][[5, 6], [7, 8]]を取得し、その中から[0]を選択して[5, 6]を取得し、最後にその中の[1]を指定して6を取得しています。

cube[0][1][0] = 10

  • この部分では、cube[0][1][0] = 10という操作で、cubeの中の1つ目の次元(Z軸)の中から2つ目の次元(Y軸)を選び、その中の1つ目の要素を10に変更しています。
  • 結果として、配列の内容が更新され、cubeの中身が上記のように表示されます。

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

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

コメント

コメントする

目次