###1.はじめに
今回は基本的なデータ型の1つである、範囲型についての説明と、使い方を解説していきます。(もう1つの基本的なデータ型であるストライド型については次回の記事で解説します。)
###2.範囲型とは
まずSwiftには範囲演算子というものがあり、「A..<B」や「A...B」など、上限値Bを範囲に含めなかったり、範囲に含めたりするものがあります。ここでは上限、下限のデータ型を境界値型と呼ぶことにします。境界値型をTで表すとすると、先ほどの前者の範囲を表すデータ型をRange<T>、後者はClosedRange<T>のように型パラメータ付きの記述で表すことができます。ただし範囲を表さなくてはいけないので、Tは要素間の大小比較が可能な型でなくてはならないことに注意してください。
###3.片側範囲型と範囲演算子
範囲型には上限値のみの範囲、下限値のみの範囲もあり、これらを片側範囲といいます。ここまでで説明したものも含め、次にまとめます。
- A..<B
- Range<Int>
- Range<Double>
- A...B
- ClosedRange<Int>
- ClosedRange<Double>
- A...
- PartialRangeFrom<Int>
- PartialRangeFrom<Double>
- ..<B
- PartialRangeUpTo<T>
- ...B
- PartialRangeThrough<T>
PartialRangeFrom<T>型は下限値のみの範囲で、下限値は必ず範囲に含まれます。上限値のみの範囲では、上限値自体を範囲に含めるかどうかで2つの種類があります。上限値を含まないのがPartialRangeUpTo<T>型で、含むのがPartialRangeThrough<T>型です。
以下では範囲型のインスタンスのことを範囲と呼ぶこととします。範囲型は構造体として定義されているので、範囲自体もそのインスタンスとして初期化したり、メソッドやプロパティを利用できます。範囲型の初期化にはイニシャライザよりも範囲演算子を利用するのが簡単です。以下にいくつかの例を示します。
0 ... 5 //ClosedRange<Int>型
"a" ... "x" //ClosedRange<String>型
1.5 ..< 4.0 //Range<Double>型
10... //PartialRangeFrom<Int>型
...UInt(25) //PartialRangeThrough<UInt>型
..<Float(3.14) //PartialRangeUpTo<Float>型
###4.範囲型のプロパティとメソッド
範囲型の主なプロパティとメソッドを示します。範囲型によっては備えている機能が異なることがあるので注意してください。
lowerBound: T { get }
範囲の下限値
upperBound: T { get }
範囲の上限値
contains(_: T) -> Bool
引数の値が範囲に含まれる場合にTrueが返る
overlaps(_: Range<T>) -> Bool
インスタンスの範囲と引数の範囲が重複しているとTrueが返る
###5.乱数の生成
ここで乱数の生成等、ランダム性を利用する際の方法についてまとめます。Swiftには標準ライブラリで、整数や実数で範囲を指定し、そこに含まれる乱数を返すというものが提供されています。以下に示します。
Int.random(in: 2 ... 4) //2から4のまでのいずれかの整数
Double.random(in: 3.14 ..< 4.00) //3.14から4.00までのいずれかの実数
Bool.random() //trueまたはfalse
このように、整数、実数、Bool型のタイプメソッドで乱数を生成できます。引数にはその型を境界値型とするRange型かClosedRange型の範囲を指定します。Bool型の場合は引数は不要です。
また他の方法として、shuffled()というメソッドを利用して、含まれる要素をシャッフルした配列を返します。
(2..<6).shuffled() //[3, 2, 5, 4]等を生成
String("シャッフルします".shuffled()) //"ッフすシャまルし"等を生成
その他にも、randomElement()というメソッドで、要素をランダムに1つ取り出すことができます。要素がない場合はnilが返ってくるので、型はオプショナル型になります。
(1...9).random.Element()! //1~9のどれか
["攻撃する", "防御する", "逃げる"].randomElement()! //3つの文字列のどれか
これらのメソッドの実行には、システムが用意した乱数ジェネレータが使われ、乱数列の初期設定は実行されるたびに自動的に行われるので、私たちが初期値を与える必要はありません。
###6.おわりに
今回は範囲型についての説明と、その基本的な使い方や、それを利用した乱数の生成法についての解説をしました。冒頭でもお伝えした通り、次回は同じく基本的なデータ型の1つである、ストライド型についての解説の記事を上げようと思います。記事が上がりましたら、そちらの方もぜひご覧ください。