【SwiftUI】要素のシャッフルと乱数(ランダム)の使い方

本記事では、SwiftUIで使用できる文字列、レンジ、配列などの様々なデータをシャッフルする方法と乱数の使い方を解説していきます。

シャッフルや乱数を使用することで、数字をランダムに表示する計算アプリなどを作成することもできます。

文字列をシャッフル

shuffled()メソッドを利用することで、指定した文字列をシャッフルしてそれぞれの文字列を配列に表示することができます。

これはあまり実用的に使用する機会は少ないと思いますが、頭の片隅にでも入れておくといいでしょう。

var words = "SwiftUIWords"
var wordList = words.shuffled()
print(wordList)

//実行結果
"["i", "w", "S", "d", "U", "f", "o", "W", "t", "r", "I", "s"]"

レンジをシャッフル

レンジとは0~10などの値の範囲を指定するもので、本来は任意の値がレンジで指定した値の範囲内に収まっていることを評価したり、ループ処理の回数・範囲を定義するために用いられることが一般的です。

レンジに対してshuffled()を使用することで、レンジで指定した範囲の数値をランダムに取り出して配列にすることができます。

var range = 1...10
var rangeList = range.shuffled()
print(rangeList)

//実行結果
"[2, 5, 10, 1, 7, 4, 6, 9, 8, 3]"

配列をシャッフル

配列をシャッフルして、配列内の順序を入れ替えるためにはshuffle()を使用します。文字列やレンジをシャッフルした際に使用したshuffled()とは異なる点注意してください。

shuffleを使用することで、既存の配列の順序を入れ替えることができます。

var list = ["東京","埼玉","群馬","栃木","茨城","千葉","神奈川"]
list.shuffle()
print(list)

//実行結果
"["群馬", "千葉", "茨城", "栃木", "埼玉", "神奈川", "東京"]"

shuffle()とshuffled()の違い

ここまでで文字列・レンジにはshuffledを使用し、配列にはshuffleを使用して値をシャッフルできることを紹介してきましたので、その違いについて説明します。

shuffleは、指定した配列そのものの要素を書き換えることができます。配列.shuffle()を使用した場合には配列そのものの順序が入れ替わります。

一方でshuffledは、順序を入れ替えた新たな配列データを返却します。

そのため、文字列やレンジはデータ型が配列ではないため、そもそも.shuffle()を使用することができません。新しく配列を格納するための変数を用意し、shuffled()によって得られた新たな配列データを保持する必要がある点には注意しましょう。

乱数を生成する

乱数の生成はInt.random()を使用することで実現できます。

randomにrangeを渡してあげることで、rangeで指定した範囲の中から任意の1つの数値型データを取得することができます。

var intNum = Int.random(in: 1...10)
print(intNum)

//実行結果
7

真偽値をランダムに選択

trueとfalseの2つから成る真偽値をランダムに取得するには、Bool.ranom()を使用します。

2種類の選択肢からランダムに値を選択して取得したい場合、例えばあたり/ハズレを出す必要のあるアプリを使用する際などに使用することができます。

let randomBoolValue = Bool.random()
print(randomBoolValue)

//実行結果
true

ただ、実際に当たりハズレの機能を実装する際には確率の設定などが発生する場合が多いため、使用する頻度は少ないかもしれません。

配列からランダムに取り出す

配列の中からランダムに値を一つ取り出す方法を2つほどご紹介します。

基本として配列から任意の値を取得するためには配列名[インデックス番号]を使用します。配列のindexは0から始まるため、1番目の値を取得するには配列名[0]、2番目の値を取得するには配列名[1]を指定します。

var list = ["東京","埼玉","群馬","栃木","茨城","千葉","神奈川"]
print(list[0])
//実行結果
東京

print(list[1])
//実行結果
埼玉

まずは、シャッフルした配列の先頭から値を取得する方法です。

本記事で紹介したshuffle()を使用して配列の順序をシャッフルした後に配列の先頭要素を取得することで毎回異なる値を取得することができます。

var list = ["東京","埼玉","群馬","栃木","茨城","千葉","神奈川"]
list.shuffle()

print(list[0])
//実行結果
栃木

続いて最も簡単に配列から要素をランダムに取得することができるrandomElement()をご紹介します。

randomElementは、配列の要素の中身をシャッフルしなくても配列の中からランダムに一つの値を取り出すことができます。

実際に配列からランダムに値を取り出したい場合にはこちらの機能を使用するのがおすすめです。

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

print(list.randomElement()!)
//実行結果
神奈川

使用時には、randomElementから取得できる値がオプショナル型であるため、値を使用する前に 「!」をつけたりしてアンラップしてあげる必要がある点に注意する必要があります。

オプショナル型、アンラップ方法については以下の記事で紹介していますので参考にしてみてください。

まとめ

本記事でご紹介した要素のシャッフルや乱数についての内容をまとめます。

  • 文字列やレンジをシャッフルして配列に取り出すにはshuffled()を使用
  • 配列の要素をシャッフルするためにはshuffle()を使用
  • 整数の乱数を生成するにはInt.random(in: 範囲)を使用
  • 真偽値をランダムに取得するにはBool.random()を使用
  • 配列からランダムに値を取得するには配列名.randomElement()を使用

他にもナビゲーションビューを利用した画面遷移やリスト表示を行う方法などについても解説していますので以下の記事もSwiftUIを利用した開発に役立ててみてください。