iOS 스터디 Part2 Range

값의 간격이며 하한과 상한으로 정의되고, 두 가지 범위 연산자를 사용하여 범위를 생성합니다

Advanced Swift (by Chris Eidhof) 책을 번역 후 참고하여 작성하였습니다.

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