実行環境、Xcode 9.2、Swift 4.0。
Swiftの範囲型は、整数か小数か、もしくは範囲の指定方法によって、それぞれ異なる型になります。
CountableRange型
整数の範囲指定その1
let range = 0..<3
print("type: \(type(of: range))")
print("lower:\(range.lowerBound) upper:\(range.upperBound) count:\(range.count)")
print("range.contains(0) \(range.contains(0))")
print("range.contains(1) \(range.contains(1))")
print("range.contains(2) \(range.contains(2))")
print("range.contains(3) \(range.contains(3))")
実行結果
type: CountableRange<Int>
lower:0 upper:3 count:3
range.contains(0) true
range.contains(1) true
range.contains(2) true
range.contains(3) false
- 範囲型を明示宣言しないと、CountableRange型になる
- lowerBound、upperBoundは、0..<3で指定したように、それぞれ0、3になる。upperBoundが2にはならないことに注意。
変数宣言する際に型指定したい場合は、以下のようにする
var range: CountableRange<Int>
range = 0..<3
// Int64の範囲を宣言したい場合
var range2: CountableRange<Int64> = 0..<3
変数で指定することもできる
let i = 0
let j = 0
let range = i..<j
Range型として宣言することもできる。
var range3: Range<Int64> = 0..<3
- ただし、countプロパティは使えない。
- CountableRangeとRangeに互換性はなく、お互いを変数代入できない
CountableClosedRange型
整数の範囲指定その2
let range2 = 0...3
print("type: \(type(of: range))")
print("lower:\(range2.lowerBound) upper:\(range2.upperBound) count:\(range2.count)")
print("range.contains(0) \(range2.contains(0))")
print("range.contains(1) \(range2.contains(1))")
print("range.contains(2) \(range2.contains(2))")
print("range.contains(3) \(range2.contains(3))")
print("range.contains(3) \(range2.contains(4))")
実行結果
type: CountableClosedRange<Int>
lower:0 upper:3 count:4
range.contains(0) true
range.contains(1) true
range.contains(2) true
range.contains(3) true
range.contains(3) false
- 0...3のように指定すると3も含む範囲となる
- この場合はCountableClosedRange型になる
- upperBoundが3になり、範囲の最後の値を含むことに注意
- 先述のCuontableRangeのupperBoundはその値を範囲に含まない。
Range型
小数の範囲その1
let range3 = 0.0..<3.5
print("type: \(type(of: range3))")
print("lower:\(range3.lowerBound) upper:\(range3.upperBound)")
print("range.contains(0.0) \(range3.contains(0.0))")
print("range.contains(3.49) \(range3.contains(3.49))")
print("range.contains(3.5) \(range3.contains(3.5))")
実行結果
type: Range<Double>
lower:0.0 upper:3.5
range.contains(0.0) true
range.contains(3.49) true
range.contains(3.5) false
- 明示的型宣言しないと小数の場合はRange型になる
- 小数は数えられないのでCountableではない
- CountableRange同様にupperBoundは範囲に含まない
ClosedRange型
小数の範囲その2
let range4 = 0.0...3.5
print("type: \(type(of: range4))")
print("lower:\(range4.lowerBound) upper:\(range4.upperBound)")
print("range.contains(0.0) \(range4.contains(0.0))")
print("range.contains(3.5) \(range4.contains(3.5))")
print("range.contains(3.51) \(range4.contains(3.51))")
実行結果
type: ClosedRange<Double>
lower:0.0 upper:3.5
range.contains(0.0) true
range.contains(3.5) true
range.contains(3.51) false
- CountableClosedRange同様にupperBoundは範囲に含む
printしてみると理解が進んでいいですね。