본 글은 야곰의 스위프트 프로그래밍: Swift5 교재를 토대로 공부한 내용과 찾아본 내용을 요약한 것입니다.
Swift에서 소괄호(())는 생략 가능하지만, 중괄호({})는 생략할 수 없습니다.
let first: Int = 5
let second: Int = 5
var biggerValue: Int = 0
if first > second { // 조건 수식 소괄호 X
biggerValue = first
} else if (first == second) { // 조건 수식 소괄호
biggerValue = second
}
// else 문은 없어도 됨
또한, Swift에서는 다른 언어와 달리 if 구문의 조건이 Bool 타입이어야 합니다. 아래에서 예시를 들어보겠습니다.
// swift 예시
let someValue = 1
// Swift에서는 아래와 같은 코드가 컴파일 에러를 발생시킵니다.
// if someValue {
// // Do something
// }
// 올바른 사용 예:
if someValue == 1 {
// Do something
}
// C언어 예시
int a = 0;
if (a) {
// 이 블록은 실행되지 않습니다. a가 0이기 때문입니다. 컴파일 에러가 나지 않는다.
} else {
// 이 블록이 실행됩니다.
}
Swift의 switch 구문은 여러 가능한 케이스 중에서 하나를 선택하여 실행할 수 있도록 하는 조건문입니다. Swift의 switch 구문은 다른 프로그래밍 언어들과 비교했을 때 몇 가지 독특한 특징을 가지고 있습니다.
기본 구조
switch 구문은 특정 값을 여러 case 중 하나와 비교하여 해당하는 case의 코드 블록을 실행합니다. 모든 가능한 케이스를 처리해야 하며, 어떤 케이스에도 해당하지 않는 경우를 위해 default 케이스를 제공해야 합니다.
let someValue = 3
switch someValue {
case 1:
print("값은 1입니다.")
case 2:
print("값은 2입니다.")
case 3:
print("값은 3입니다.")
default:
print("값은 1, 2, 3 중에 하나가 아닙니다.")
}
열거형 예시
enum Season {
case spring
case summer
case autumn
case winter
}
let currentSeason = Season.autumn
switch currentSeason {
case .spring:
print("꽃이 피는 계절입니다.")
case .summer:
print("날씨가 더운 계절입니다.")
case .autumn:
print("단풍이 지는 계절입니다.")
case .winter:
print("눈이 오는 계절입니다.")
}
swift에서 swift 구문의 독특한 특징
let someValue = 85
switch someValue {
case 0..<50:
print("값은 50 미만입니다.")
case 50..<100:
print("값은 50 이상 100 미만입니다.")
default:
print("값은 100 이상입니다.")
}
let somePoint = (1, 1)
switch somePoint {
case (0, 0):
print("(0, 0)은 원점입니다.")
case (_, 0):
print("x축에 있습니다.")
case (0, _):
print("y축에 있습니다.")
case (-2...2, -2...2):
print("(-2, -2)와 (2, 2) 사이에 있습니다.")
default:
print("상자 밖에 있습니다.")
}
let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
print("x축에 있으며, x의 값은 \(x)입니다.")
case (0, let y):
print("y축에 있으며, y의 값은 \(y)입니다.")
case let (x, y):
print("어딘가에 있으며, 그 위치는 (\(x), \(y))입니다.")
}
let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
print("x와 y가 같습니다.")
case let (x, y) where x == -y:
print("x와 y가 대칭적입니다.")
case let (x, y):
print("(\(x), \(y))")
}
Swift의 switch 구문은 이러한 특징 덕분에 매우 강력하고 유연한 조건 처리를 가능하게 합니다.
swift의 반복문은 기존 프로그래밍 언어의 반복문과 크게 다르지 않습니다만, 정통적인 C 스타일의 for 구문이 사라졌다는 것과 조건에 괄호를 생략할 수 있습니다. 또한, do-while 구문은 swift에선 repeat-while 구문으로 구현되어 있습니다.
아래 예시에서 C언어 스타일의 swift 초기 버전의 for 구문과 현재 swift의 for 구문 예시를 들어보겠습니다.
// Swift 초기 버전의 for 구문
// C 언어와 유사하게 초기 조건, 종료 조건, 그리고 반복마다 실행되는 표현식을 세미콜론으로 구분
for var i = 0; i < 10; i++ {
print(i)
}
// 현재 Swift의 for 구문
for i in 0..<10 {
print(i)
}
while 구문도 다른 프로그래밍 언어의 while 구문과 크게 다르지 않습니다. for-in 구문과 마찬가지로 continue, break 등의 제어 키워드 사용이 가능합니다.
var names: [String] = ["Joker", "Jenny", "Nova", "Juhyun"]
while names.isEmpty == false {
print("Good bye \(names.removeFirst())"
// removeFirst()는 요소를 삭제함과 동시에 삭제한 요소를 반환
}
// Good bye Joker
// Good bye Jenny
// Good bye Nova
// good bye Juhyun
Swift의 repeat-while 반복문은 다른 언어의 do-while 반복문과 유사합니다. 이 구조는 먼저 코드 블록을 실행한 다음, 조건을 평가하여 해당 조건이 true인 동안 코드 블록을 반복 실행합니다. 이는 적어도 한 번은 코드 블록이 실행됨을 보장합니다.
var number = 1
repeat {
print(number)
number += 1
} while number <= 5
// 1
// 2
// 3
// 4
// 5
Swift에서 구문 이름표(statement label)는 특히 중첩된 루프(loop)나 조건문에서 특정 구문을 명시적으로 식별할 때 유용합니다. 구문 이름표를 사용하면 반복문이나 조건문 안에서 다른 반복문이나 조건문으로 제어를 전달할 때, 어떤 구문에 대한 제어를 전달할지 명확하게 지정할 수 있습니다. 이는 break와 continue 키워드와 함께 사용됩니다.
구문 이름표는 다음과 같이 정의됩니다.
labelName: while condition {
statements
}
break와 continue와의 사용
outerLoop: for i in 1...3 {
innerLoop: for j in 1...3 {
if i == 2 && j == 2 {
break outerLoop
}
print("i: \(i), j: \(j)")
}
}
// i: 2, j: 2
구문 이름표를 사용하면 복잡한 중첩 구조에서도 제어 흐름을 명확하게 관리할 수 있습니다. 이는 코드의 가독성과 유지 보수성을 향상시키는 데 도움이 됩니다.