Swift의 조건문에는 If, Switch, Guard가 있다고 한다.
Guard는 다음에 더 자세하게 공부해 보기로 한다.
If
스위프트의 If구문은 조건의 값이 꼭 Bool 타입이어야 한다.
If 조건을 충족하여 블록 내부 명령문이 실행되면 그 다음 else if의 조건을 충족해도 실행되지 않고 조건문을 빠져나온다.
let a = readLine()!.split(separator: " ").map{Int(String($0))!}
let b: [Int]
b = a
if b[0] == b[1] && b[1] == b[2] {
print(b[0] * 1000 + 10000)
} else if b[0] == b[1] || b[1] == b[2] || b[0] == b[2] {
if b[0] == b[1] {
print(b[0] * 100 + 1000)
} else if b[1] == b[2] {
print(b[1] * 100 + 1000)
} else {
print(b[2] * 100 + 1000)
}
} else {
print(max(b[0], b[1], b[2]) * 100)
}
위와 같이 if의 조건에 부합하면 블록 내부의 명령을 실행시킨다. 마지막에 else가 없고, 부합하는 조건이 없다면 아무 실행도 일어나지 않는다.
Switch, Case
Case 내부의 코드를 모두 실행하면 break 없이도 switch 구문이 종료된다.
스위프트에서 switch 구문의 case를 연속 실행하려면 fallthrough 기능을 사용하면 된다.
C언어에서는 정수 타입만 들어갈 수 있었으나, 스위프트에서는 switch 구문의 조건에 다양한 값이 들어갈 수 있다.
- 각 case에 들어갈 비교값은 입력값과 데이터 타입이 같아야함
- 비교될값이 명확히 한정적인 값(열거형 값 등)이 아닐 때는 default를 작성해야함
- 각 case에는 범위 연산자를 사용할 수도, where 절을 사용하여 조건을 확장할 수도 있다.
1. fallthrough와 break
fallthrough를 사용하면 바로 아래 케이스가 조건에 상관없이 실행된다.
또한 break이 실행될 경우 바로 switch문이 종료된다.
let integerValue: Int = 0
switch integerValue {
case 0:
print("0이다")
case 1...10:
print("1에서 10사이다")
fallthrough
case Int.min..<0, 101..<Int.max:
print("0보다 작거나 101보다 크거나")
break
default:
print("10과 100사이")
}
2. String 적용
let stringValue: String = "Jack"
switch stringValue {
case "Jack":
print("I'm Jack")
case "Lily":
print("I'm Lily")
case "Apple", "Banna":
print("We are fruits")
default:
print("\(stringValue), who are you?")
}
3. Tuple 적용
typealias NameAge = (name: String, age: Int)
let tupleValue: NameAge = ("Jack", 100)
switch tupleValue {
case ("Jack", 100):
print("I'm Jack and 100 years old")
case ("Jack", _):
print("I'm \(name)")
case (_, 100):
print("I'm \(age) years old")
default:
print("who are you looking for")
}
4. let으로 호출
와일드카드 식별자를 사용하면 무시된 값을 직접 가져와야하는 불편함 발생. 따라서 미리 지정된 조건 값을 제외한 다른 값은 실행문 안으로 가져올 수 있다. 이때 let 바인딩 사용.
typealias NameAge = (name: String, age: Int)
let tupleValue: NameAge = ("Jack", 100)
switch tupleValue {
case ("Jack", 100):
print("I'm Jack and 100 years old")
case ("Jack", let age):
print("I'm Jack and \(age) years old")
case (let name, 100):
print("I'm \(name) and 100 years old")
default:
print("who are you looking for")
}
5. where로 확장
스위프트에서 where는 패턴과 결합하여 조건을 추가하거나, 타입에 대한 제약을 추가할 때 사용됨.
let 티어: String = "실버"
let 경력: Int = 1
let 롤린이: Bool = false
switch 티어 {
case "실버" where 롤린이 == true:
print("롤린이입니다.")
case "실버" where 경력 < 2 && 롤린이 == true:
print("실버입니다.")
case "실버" where 경력 > 5:
print("고인물입니다.")
default:
print("측정불가")
}
6. 와일드 카드와 default
case문 내에서 와일드 카드와 default는 활용에 큰 차이가 없음.
추후 case가 늘어날 것을 예상하여 미리 만들어 둘때 case _:(와일드 카드)를 많이 쓰는 거같음.
enum Alphabet {
case a, b, c, d
}
let answer: Alphabet = .d
switch answer {
case .a:
print("right")
case .b:
print("right")
case .c:
print("right")
case _:
print("not yet")
}
(* 야곰 스위프트 프로그래밍 서적을 참고하였습니다)
'TIL > Swift 내용 정리' 카테고리의 다른 글
Swift Deep Dive: How to improve Class' performance in Swift? (0) | 2023.02.07 |
---|---|
Swift Deep Dive: Class Struct Enum (0) | 2023.02.07 |
Swift Deep Dive: Basic Operators (1) | 2022.05.09 |
Swift Deep Dive: Classes and inheritance (1) | 2022.04.19 |
Swift Deep Dive: 흐름제어(For, While) (0) | 2022.03.24 |