【Swift/SwiftUI】配列の部分的な置換と部分配列取得

本記事では、配列の一部分の要素を置換する方法と配列の中から少しデータ型の異なる部分配列を取得する方法を解説していきます。部分配列を取得した場合に必要となる特殊な対応についても解説していますのでぜひ最後までご覧ください。

配列の要素を部分的に置換

配列の要素を部分的に置換するというのは、複数の要素がある配列の中から1つの要素ではなく、任意の複数の要素をまとめて置き換えるというアクションです。

1つの要素を置き換える場合には、以下のように直接インデックス番号を指定しますね。

var prefectures = ["埼玉","千葉","東京","神奈川","茨城","群馬","栃木"]
prefectures[1] = "大阪"

print(prefectures)
//実行結果: ["埼玉","大阪","東京","神奈川","茨城","群馬","栃木"]

一方で複数の要素を置き換える場合には、複数のインデックスを範囲型データとして指定します。

これにより、配列内のまとまった複数のデータをまとめて置換することができます。

var prefectures = ["埼玉","千葉","東京","神奈川","茨城","群馬","栃木"]
prefectures[1...3] = ["大阪","京都","奈良"]

print(prefectures)
//実行結果:["埼玉", "大阪", "京都", "奈良", "茨城", "群馬", "栃木"]

置換に使用する配列は、置換対象の配列と要素数を合わせる必要はありませんが、インデックスの範囲型データの数とは合致しているのが好ましいです。

例えば、以下のように1…2を指定していても要素数が4つになると、1,2番目の要素を4つの要素で書き換えるため、要素数が変わってしまい意図せぬ動作となってしまう可能性があります。

var prefectures = ["埼玉","千葉","東京","神奈川","茨城","群馬","栃木"]
prefectures[1...2] = ["大阪","京都","奈良","和歌山"]

print(prefectures)
//実行結果:["埼玉", "大阪", "京都", "奈良", "和歌山", "神奈川", "茨城", "群馬", "栃木"]

また、インデックス指定部分に0…0を指定すると配列の前半に指定した配列をまるごと追加することができます。

var prefectures = ["埼玉","千葉","東京","神奈川","茨城","群馬","栃木"]
prefectures[0...0] = ["大阪","京都","奈良","和歌山"]

print(prefectures)
//実行結果:["大阪", "京都", "奈良", "和歌山", "千葉", "東京", "神奈川", "茨城", "群馬", "栃木"]

部分配列の取得

配列からデータを取得する際に、インデックス指定に範囲型データを使用することで配列の中から指定した範囲内の要素を部分配列として取得することができます。

var prefectures = ["埼玉","千葉","東京","神奈川","茨城","群馬","栃木"]

print(prefectures[2...4])
//実行結果:["東京", "神奈川", "茨城"]

取り出した部分配列のデータ型は、ArrayではなくArraySliceという型となります。

ArraySlice型の配列は、要素のインデックス番号が0から始まることが保証されておらず、元の配列のインデックス番号が継承されています。

例えば、以下のように元の配列のインデックス2から4を取り出してきた部分配列は最初のインデックス番号が2から始まります。

var prefectures = ["埼玉","千葉","東京","神奈川","茨城","群馬","栃木"]

var part_prefectures = prefectures[2...4]
print(part_prefectures[2])
//実行結果:東京

最後に

本記事では、配列の一部のデータを置き換える方法と配列の中から部分的な要素を取得する方法と取り出したデータを扱う方法について解説してきました。

記事内でもお話ししたとおり、多くの要素がある配列の場合でも常に指定した位置から決まった数の要素を取得したい場合などに便利に使用できるのが部分配列になります。

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