iOS 스터디 Part2 Range
값의 간격이며 하한과 상한으로 정의되고, 두 가지 범위 연산자를 사용하여 범위를 생성합니다
Protocols.
Range: 왼쪽과 오른쪽 값을 포함하는 범위 생성(…)
ClosedRange: 왼쪽은 포함하고 오른쪽 값은 포함하지 않는 범위 생성(..<)
let singleDigitNumbers = 0..<10 Array(singleDigitNumbers) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] let lowercaseLetters = Character("a")...Character("z") Array(lowercaseLetters) (0...10).lowerBound // 1 (0...10).upperBound // 10 (0...10).count // 10 (0...10).isEmpty // false (0...10).contains(1) // true (0...10) ~= 1 // true
PartialRangeFrom: 시작값 부터 계속 올라간다(중단점이 없으면 무한 루프)
PartialRangeThrough: 이전 값부터 마지막 값까지
PartialRangeUpTo: 이전 값부터 마지막 값을 포함하지 않는 값까지
// 하한선이 없으면 셀 수 있는 여부(정수)와 관계없이 Loop가 불가능 let fromA: PartialRangeFrom<Character> = Character("a")... let throughZ: PartialRangeThrough<Character> = ...Character("z") let upto10: PartialRangeUpTo<Int> = ..<10
Range Expressions
요소가 범위 내에 포함되어 있는지
let numbers = [1,2,3,4] numbers[1...2].contains(2) // true numbers[1...2] ~= 2 // true
컬렉션이 주어지면 완전히 지정된 범위를 계산
let numbers = [1,2,3,4] numbers[2...] // [3, 4] numbers[..<1] // [1] numbers[1...2] // [2, 3]
RangeSet: 동일한 요소를 범위를 이용하여 병합하는 방법
let numbers = RangeSet(1..<5) numbers.insert(contentsOf: 11..<15) Array(numbers.ranges) let numbers = RangeSet(1..<5, 11..<15) Array(numbers.ranges)
Check Points.
정수인 경우만 Collection Protocol 준수하여 Loop 가능
for i in 0..<10 {
print("\\(i)", terminator: " ")
} // 0 1 2 3 4 5 6 7 8 9
for i in Character("a")...Character("z") {
print("\\(i)", terminator: " ")
} // error: protocol 'Sequence' requires that 'Character' conform to 'Strideable'
“RangeSet is more storage-efficient because it can merge adjacent values into a single range.”
⇒ RangeSet은 범위로 중복을 제거하여 Set과 비교할 때 저장 공간을 더 효율적으로 사용합니다.
let duplicatedNumbers = Set<[1,2,3,3,4]>
duplicatedNumbers.sorted() // 중복을 허용하지 않기 때문에 중복 제거를 위해 정렬 수행 O(n log n)
Array(duplicatedNumbers) // 1,2,3,4
let duplicatedNumbers = RangeSet(1...3, 3..<5) // 범위이기 때문에 1~3, 4 O(1)으로 중복제거
Array(duplicatedNumbers.ranges) // 1,2,3,4
Last updated