Range(..<)와 ClosedRange (...)는 끝값 포함여부에 차이가 있다.
굳이 두 개로 나눌정도의 이점이 있을까라는 질문이 들어 이 글을 쓰게됐다.
변환 코드를 만들어보면 차이점을 쉽게 파악 할 수 있다:
extension Range {
func toClosedRange() -> ClosedRange<Bound> where Bound: Strideable, Bound.Stride: SignedInteger {
return lowerBound...(upperBound.advanced(by: -1))
}
}
extension ClosedRange {
func toRange() -> Range<Bound> where Bound: Strideable, Bound.Stride: SignedInteger {
return lowerBound..<upperBound.advanced(by: 1)
}
}
// 사용 예제
let range: Range<Int> = 1..<5
let closedRangeFromRange = range.toClosedRange()
print(closedRangeFromRange) // 1...4
let closedRange: ClosedRange<Int> = 1...5
let rangeFromClosedRange = closedRange.toRange()
print(rangeFromClosedRange) // 1..<6
PartialRange는 한쪽이 비어있는 범위 타입들이다:
1. PartialRangeFrom (lower...)
2. PartialRangeUpTo (..<upper)
3. PartialRangeThrough (...upper)
위의 범위들은 더욱 쓸일이 없기에 타입이 매우 생소하다.
Int 범위를 다루는 것이 일반적인 경우이기 때문에, 좀처럼 다른 타입들을 다뤄볼 기회가 없다.
그런 이유로 Float, Charecter, Date 등의 범위를 지정할 수 있다는 걸 까먹을 때가 많다. 그리고 Generic에 들어가는 타입에 따라 ForEach와 .underestimatedCount가 컴파일러 단에서 결정된다.
실험해 본 바로는 Int만 ForEach와 .underestimatedCount 인터페이스를 가지고 있었다.
swift에서 ~=
문법은 좀처럼 익숙해지지 않는다.
나중에 사용법이라도 적어둬야겠다.