Closed Range, Range (closed range operator, half-open range operator)

betterhee 2021. 2. 6. 13:23

ClosedRange 구조체

@frozen struct ClosedRange<Bound> where Bound : Comparable

ClosedRange 구조체의 타입 매개변수 Bound는 Comparable 프로토콜을 준수하는 타입이어야 한다는 타입 제약이 명시되어 있다.
(+ Comparable 프로토콜을 준수하면 <, <=, >=, > 연산자로 비교가 가능함)

static func ... (minimum: Self, maximum: Self) -> ClosedRange<Self>
let throughFive = 0...5 // [0, 5]

ClosedRange 인스턴스는 closed range operator(닫힌 범위 연산자) ... 로 만들 수 있다.
전제조건 minimum <= maximum 를 만족해야 한다.

throughFive.contains(0)  // true
throughFive.contains(3)  // true
throughFive.contains(5)  // true
throughFive.contains(10) // false

upper bound(상한)과 lower bound(하한)을 모두 포함한다.

let zeroInclusive = 0...0
zeroInclusive.contains(0) // true
zeroInclusive.isEmpty     // false

상한을 포함하므로, 하한과 상한이 동일한 ClosedRange 인스턴스는 해당 값을 포함하게 된다.
따라서 Closed Range 인스턴스는 빈 범위를 나타낼 수 없다.

Range 구조체

@frozen struct Range<Bound> where Bound : Comparable
static func ..< (minimum: Self, maximum: Self) -> Range<Self>
let underFive = 0.0..<5.0 // [0.0, 5.0)

Range 인스턴스는 half-open range operator(반-개방 범위 연산자) ..< 로 만들 수 있다.

underFive.contains(3.14) // true
underFive.contains(6.28) // false
underFive.contains(0.0)  // true
underFive.contains(5.0)  // false

위와 같이 어떠한 값이 해당 범위에 포함하는지 확인할 수 있다.

// Range
let empty = 0.0..<0.0
empty.contains(0.0) // false
empty.isEmpty       // true

// ClosedRange
let zeroInclusive = 0...0
zeroInclusive.contains(0) // true
zeroInclusive.isEmpty     // false

또한 Closed Range와 다르게, 빈 범위를 나타낼 수 있다.

참조