【Swift/SwiftUI】オプショナル型(nil)を要素に持つ配列の扱い方

本記事では、Swiftにてnilを扱うことのできるオプショナル型のデータを配列の要素として持ち、参照や更新を行う方法を解説していきます。

配列にオプショナル型を含むメリット

配列は通常、Int型やStringなどの初期に宣言されたデータが複数格納されます。

配列にデータが入っていなければ、2件のデータが入っていれば2件の配列、0件の空の配列となります。

オプショナル型を配列に格納できるようにする1つ目のメリットとして、まだ配列に格納するデータは決まっていないが配列のデータ個数を決めておきたい場合です。

最終的に10件のデータが入る配列を用意したい場合に、初期値としてnilを10件入れておくことで、明示的に10件のデータを入れる配列であることを表すことができます。更に、nilが入っていることにより、配列の何番目のデータが不足しているかも確認することができます。

2つ目のメリットとしては、Intの配列であればデータの値が0であることと、そもそも値が存在していないことを区別するためにnilを使用することができます。

例えば、クラス内で学級委員を決めるクラス内投票を行う場合、投票数が0件の生徒と欠席により投票対象外となった生徒をnilを使用することにより区別することができます。

配列にオプショナル型データを入れる

配列にオプショナルを含めるには、変数の宣言時に[データ型?]と宣言します。

[Int?]と宣言した場合には、Int型の整数データとnilを同一の配列内に格納することができます。

オプショナル型のデータが入る配列を宣言した場合には、普通の整数や文字列を配列に入れていたとしても配列内の各要素が全てオプショナル型データとなる点には注意が必要です。

var scores: [Int?] = [100, nil, 80, 95]

配列のオプショナル型データを取り出す

オプショナル型データが入った配列を取り出して使用する際にはアンラップが必要になります。

以下の例では、オプショナル型データを含む配列voteをループして参照し、Int型を格納できる配列fill_voteに値を追加する処理を行っています。

ループ内では、voteに対してif-let文で安全にアンラップを行い、値がnilではない場合にのみfill_voteに代入を行っています。

var vote: [Int?] = [100, nil, 80, 95, 0]
var fill_vote: [Int] = []

for v in vote {
    if let s = v {
        fill_vote.append(s)
        print("投票数: \(s)")
    } else {
        print("投票なし")
    }
}

print(fill_vote)

//実行結果:[100, 80, 95, 0]

最後に

本記事では、配列の中にオプショナル型データを入れて扱う方法と、オプショナル型のデータを入れることによるメリットを解説していきました。

オプショナル型データについては、安全にアンラップを行う方法や暗黙的オプショナル型というデータ型についても別の記事で解説していますのでそちらもご確認ください。