LoginSignup
14
10

More than 5 years have passed since last update.

Swiftの範囲型を理解する

Last updated at Posted at 2018-04-05

実行環境、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してみると理解が進んでいいですね。

ukiuki256.png

14
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10