大器晩成

범위 연산자 (Range Operators) 본문

iOS/Swift 문법

범위 연산자 (Range Operators)

zerobugpark 2024. 10. 31. 16:01

 

Swift는 값의 범위를 짧게 표현하기 위해 몇몇의 범위 연산자(Range Operators)를 포함합니다.

 

범위 연산자는 특정 범위를 나타낼 때 사용됩니다.

  • 내림차순 형식으로 표기 불가합니다. (내림차순으로 변환은 가능합니다.)
  • 실수 형식의 범위도 가능합니다. (사용하는 경우가 드묾)
  • switch문에서 패턴 매칭에 사용합니다.
  • for문과 주로 함께 사용합니다. (정수인 경우)
  • 배열의 서브스크립트 문법과 함께 사용합니다.

1. 닫힌/폐쇄 범위 연산자(Closed Range Operator)

시작위치인 lowerbound부터 종료위치인 upperBound까지의 범위 실행을 정의합니다.

  • (lowerBound...upperBound)의 형태로 범위의 시작과 끝이 있는 연산자입니다.
  • lowerBound는 반드시 upperBound와 작거나 같아야 합니다. (loverBound <= upperBound)
  • 한 반향은 열리도록 정의하는 것도 가능합니다. (One-Side Ranges)
let range = 1...10     //ClosedRange<Int> -> 정수 1부터 10이하

for i in range {
    print(i, terminator: "") // 출력: 1,2,3,4,5,6,7,8,9, 10
}
  • One-Sided 표기 시에는 숫자와 범위연산자를 붙여서 써야 합니다(빈칸 허용하지 않습니다)

내림차순 표기법

//내림차순 사용 방법

for i in (1...10).reversed() {
    print(i)
}

 

2. 반 닫힌/폐쇄 범위 연산자(Half Open Range Operator)

  • (lowerBound..<upperBound)의 형태로 종료위치인 upperBound가 포함되지 않은 시작위치 lowerBound부터 upperBound까지의 범위 실행을 정의합니다.
  • 보통 컬렉션을 다룰때 많이 사용합니다.
let array: [String] = ["파이리", "꼬북이", "이상해씨", "피카츄"]

for i in 0..<array.count {
    print(array[i] , terminator: " ") // 출력: 파이리, 꼬북이, 이상해씨, 피카츄
}

let rangeH = 1 ..< 10     //Range<Int> -> 1부터 10미만

 

3. 단 방향 범위 연산자(One-Side Ranges)

  • 한방향으로 계속되는 범위에 대한 대체 형식입니다.
  • One-Sided 표기 시에는 숫자와 범위연산자를 붙여서 써야 합니다 (빈칸 허용하지 않습니다.)
let array: [String] = ["파이리", "꼬북이", "이상해씨", "피카츄"]

for i in array[...2] {
    print(i , terminator: " ") // 출력: 파이리, 꼬북이, 이상해씨
}
print() //줄바꿈 용도

for i in array[2...] {    //PartialRangeFrom<Int> 정수 1이상 ~
    print(i , terminator: " ") // 출력: 이상해씨, 피카츄
}
print() //줄바꿈 용도

for i in array[..<2] {
    print(i , terminator: " ") // 출력: 파이리, 꼬북이
}


let range3 =  ...10      //PartialRangeThrough<Int> 정수 10이하
print(range3.contains(10)) // 출력: ture

let rangeH1 =  ..<10      //PartialRangeUpTo<Int> -> 정수 10미만까지
print(rangeH1.contains(10)) //false


# 범위연산자를 변수로 받아서 다양하게 처리하는 방법
let rangeInstance: Range<Double> = 0..<10

print(rangeInstance) // 출력: 0.0..<10.0
print(rangeInstance.contains(1.5)) // 출력: true
print(rangeInstance.lowerBound) // 출력: 0.0
print(rangeInstance.upperBound) // 출력: 10.0

4. ~= (패턴매칭) 연산자

  • ~=  대상이 특정 범위에 속하는지 범위를 체크하는 연산자입니다.
  • (a...b ~= age) 오른쪽에 있는 표현식이 왼쪽의 범위에 포함되는지에 따라 참과 거짓을 리턴합니다
let rangeInstance: ClosedRange<Int> = 0...10

if rangeInstance ~= 2 {
    print("2 in \(rangeInstance)") // 출력: 2 in 0...10
}


let rangeOfString = "a"..."z"
if rangeOfString ~= "k" {
    print("k in \(rangeOfString)") // 출력: k in a...z
}

# (1 <= n <= 10) 이런 문장은 스위프트에서 성립되지 않는다.

var n = 5
if n >= 1 && n <= 10 {
    print("10이상, 10이하입니다.")
} // 출력: 1이상, 10이하입니다.

if 1...10 ~= n { //패턴매칭연산자 활용
    print("1이상, 10이하입니다.")
} // 출력: 1이상, 10이하입니다.

#switch문의 케이스에서 사용
(스위치문은 내부적으로 패턴매칭 연산자로 구현이 되어있음)
var age = 18 // 범위를 나열

switch age {
case 10...19:
    print("10대 입니다.")
case 20...29:
    print("20대 입니다.")
case 30...39:
    print("30대 입니다.")
default:
    print("그 외의 범위 입니다.")
} 
// 출력: 10대 입니다.

let point = (1, 2)

switch point {
case (0, 0):
    print("(0, 0)은 원점 위에 있다.")
case (-2...2, -2...2):
    print("(\(point.0), \(point.1))은 원점의 주위에 있다.")
default:
    print("점은 (\(point.0), \(point.1))에 위치한다.")
}

// 출력: (1,2)는 원점의 주의에 있다.

#컴파일 내부 구조
if 1..10 ~= age {

}
#컴파일 시 아래처럼 구성된다.
if (1 <= age) && (age <= 10) {
}
// ~=(패턴 매칭연산자를 사용하려면 "==, <=" 연산자를 당연히 먼저 만족해야함.)

 

5. 참고사항 

  • 중요하지 않으나, 읽기 목적으로 알아 두면 좋음.
# Closed Range Operator
1 ... 10 (정수 1부터 10 이하) // ClosedRange<Int>
1... (정수 1 이상) // PartialRangeFrom<Int>
...10 (정수 10 이하) // PartialRangeThrough<Int>

# Half-Open Range Operator
1..<10 (정수 1부터 10 미만) // Range<Int>
..<10 (정수 10 미만) // PartialRangeUpTo<Int>
728x90

'iOS > Swift 문법' 카테고리의 다른 글

조건문(switch)  (3) 2024.11.01
조건문(If문)  (0) 2024.10.31
기본 연산자 (Basic operators)  (2) 2024.10.31
타입 에일리어스(Type Alias)  (0) 2024.10.31
변수와 타입  (2) 2024.10.31