Swift - Swift의 특별한 제어문들

 

타 언어와 다른 제어문들의 특성 정리

🔘 for-in

  • 배열이나 문자열 내의 캐릭터 타입 제어에 사용된다.
  • dictionary 타입을 처리할 경우 (키, 값) 튜플을 리턴받아 처리할 수 있다.
  • 범위 연산자를 이용하여 특정 인덱스 내에서만 처리할 수 있다.
  • 반복될 값이 명시적으로 사용될 필요가 없는 경우 _로 처리한다.
let base = 3
let power = 10
var answer = 1
for _ in 1...power {
    answer *= base
}
print("\(base) to the power of \(power) is \(answer)")
// Prints "3 to the power of 10 is 59049
  • 특정 범위에서 특정 간격으로 반복을 처리할 경우 stride(from:to:by:) 함수를 이용한다.
let minutes = 60
let minuteInterval = 5
for tickMark in stride(from: 0, to: minutes, by: minuteInterval) {
    // 0~ 55분까지 매 5분마다 처리를 한다.
}
  • 닫힌 범위에 해당하는 함수는 stride(from:through:by:) 이다.
let hours = 12
let hourInterval = 3
for tickMark in stride(from: 3, through: hours, by: hourInterval) {
    // 3 ~ 12까지 3시간마다 처리한다(3, 6, 9, 12).
}

🔘 while

  • 먼저 조건을 확인하고 코드를 실행하는 while문과 코드를 먼저 실행하고 나중에 조건을 확인하는 repeat-while문이 있다.
repeat {
    statements
} while condition

🔘 switch

  • case문에는 범위 값, 튜플, 특정 타입으로의 형변환 처리가지 다룰 수 있다.
  • case에 매칭 된 값들은 임시 상수나 변수로 case의 body에 사용될 수 있다.
  • 각각의 case에는 복잡한 복잡한 조건식들을 where 절과 함께 사용할 수 있다.
  • C나 Objective-C와 달리 case body는 기본적으로 다음 case body로 이어지지 않는다. 즉, break;문에 필요 없다.
  • 각각의 case body에는 반드시 실행 가능한 코드가 있어야 한다.
  • case에서 2개 이상의 조건을 처리하려고 하면 대상 값을 ,로 이어 표시한다. 이 때 임시 상수/변수에 값을 할당하는 것도 가능하다.
let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a", "A":
    print("The letter A")
default:
    print("Not the letter A")
}
// Prints "The letter A

// 값 binding도 함께 적용
let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
    print("(\(x), \(y)) is on the line x == y")
case let (x, y) where x == -y:
    print("(\(x), \(y)) is on the line x == -y")
case let (x, y):
    print("(\(x), \(y)) is just some arbitrary point")
}
// Prints "(1, -1) is on the line x == -y
  • case문에 범위 연산자를 사용할 수 있다.
let approximateCount = 62
let countedThings = "moons orbiting Saturn"
let naturalCount: String
switch approximateCount {
case 0:
    naturalCount = "no"
case 1..<5:
    naturalCount = "a few"
case 5..<12:
    naturalCount = "several"
case 12..<100:
    naturalCount = "dozens of"
case 100..<1000:
    naturalCount = "hundreds of"
default:
    naturalCount = "many"
}
print("There are \(naturalCount) \(countedThings).")
// Prints "There are dozens of moons orbiting Saturn.
  • case문에 튜플을 사용할 수 있다.
let somePoint = (1, 1)
switch somePoint {
case (0, 0):
    print("\(somePoint) is at the origin")
case (_, 0):
    print("\(somePoint) is on the x-axis")
case (0, _):
    print("\(somePoint) is on the y-axis")
case (-2...2, -2...2):
    print("\(somePoint) is inside the box")
default:
    print("\(somePoint) is outside of the box")
}
// Prints "(1, 1) is inside the box
  • Swift에서 switch문은 여러개의 case문과 매칭될 수도 있으며 이런 경우 제일 처음의 case body가 실행된다. 위 예제에서 somePoint = (0, 0) 이라면 모든 case에 다 해당이 되나 그 중 처음으로 매칭이 되는 case (0, 0):의 body가 실행된다.
  • case문에서 임시 상수/변수에 조건 값을 할당하여 body에서 처리할 수 있다.
let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
    print("on the x-axis with an x value of \(x)")
case (0, let y):
    print("on the y-axis with a y value of \(y)")
case let (x, y):
    print("somewhere else at (\(x), \(y))")
}
// Prints "on the x-axis with an x value of 2
  • case문에는 추가 조건을 확인하기 위해 where절을 사용할 수 있다.
let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
    print("(\(x), \(y)) is on the line x == y")
case let (x, y) where x == -y:
    print("(\(x), \(y)) is on the line x == -y")
case let (x, y):
    print("(\(x), \(y)) is just some arbitrary point")
}
// Prints "(1, -1) is on the line x == -y