제어 변경 구문
- continue
- break
- fallthrough
1️⃣ continue
다음 반복을 실행하라고 알림
아래 예시는 모음이나 빈칸이 나왔을 때, 바로 다음 반복으로 넘어가라고 지시한다.
let sentance = "easy example"
var result = ""
let charactersToRemove: [Character] = ["a", "e", "i", "o", "u", " "]
for character in sentance {
if charactersToRemove.contains(character) {
continue
}
result.append(character)
}
print(result)
// syxmpl
2️⃣ break
루프의 실행을 즉시 종료한다.
즉, switch 구문을 즉시 빠져나와 실행을 종료한다.
let symbol: Character = "三"
var val: Int?
switch symbol {
case "1", "一", :
val = 1
case "2", "٢", "二", :
val = 2
case "3", "三", :
val = 3
case "4", "٤", "四",:
val = 4
default:
break
}
print(val)
// 3 출력
3️⃣ Fallthrough
continue와 다른 점 : continue는 바로 다음 반복으로 넘어가지만, Fallthrough는 다음 경우(다음 조건) 로 넘어감
case 5인 경우와 그 다음 케이스인 default 구문으로 넘어가 다음과 같이 출력된다.
let num = 5
var description = "The number \(num) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
description += " a prime number, and also"
fallthrough
default:
description += " an integer."
}
print(description)
// 다음과 같이 출력됨 "The number 5 is a prime number, and also an integer."
4️⃣ 라벨 구문
예제를 보며 살펴보자
let finalSquare = 25
var board = [Int](repeating: 0, count: finalSquare + 1)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0
while 루프에 gameLoop 라는 라벨을 붙였다.
만약 gameLoop 라벨 없이 그냥 break만 걸었다면, switch 구문만 빠져나오고 while구문은 빠져나오지 않는다.
아래 예시는 break를 통해 gameLoop 자체를 빠져나온다.
gameLoop: while square != finalSquare {
diceRoll += 1
if diceRoll == 7 { diceRoll = 1 }
switch square + diceRoll {
case finalSquare:
// diceRoll will move us to the final square, so the game is over
break gameLoop
case let newSquare where newSquare > finalSquare:
// diceRoll will move us beyond the final square, so roll again
continue gameLoop
default:
// this is a valid move, so find out its effect
square += diceRoll
square += board[square]
}
}
print("Game over!")
5️⃣ guard - else
조건을 만족하면(수식이 참이면) 다음 코드로 계속 진행하고, 만족하지 않으면(false 일 때) else 안의 구문을
실행하고 종료한다.
if와 다르게 else 절을 항상 붙여주어야 한다. 또한, 함수 혹은 반복문 안에서만 사용 가능하다.
guard [expression] else {
// false일 때 실행되는 부분
}
func greet(person: [String: String]) {
// 1.
guard let name = person["name"] else {
return
}
// 2.
print("Hello \(name)!")
// 3.
guard let location = person["location"] else {
print("I hope the weather is nice near you.")
return
}
// 4.
print("I hope the weather is nice in \(location).")
}
🔎 ex 1)
greet(person: ["name": "John"])
1. name 값이 존재하므로 2번 코드로 넘어감
2. Hello John 출력
3. location은 존재하지 않으므로 else 구문 실행하고 해당 함수 종료
결과
Hello John!
I hope the weather is nice near you.
🔎 ex 2)
greet(person: ["name": "Jane", "location": "Cupertino"])
1. name이 존재하므로 2번 코드로 넘어감
2. location 또한 존재하므로 그 다음으로 넘어감
3. 4번 출력 후 함수 종료
결과
Hello Jane!
I hope the weather is nice in Cupertino.
예외사항만을 처리하고 싶을 때 guard를 사용하면 가독성이 좋아진다.
guard는 ~이 아니면 끝내라 라는 의미이기 때문이다.
'IOS > Swift' 카테고리의 다른 글
[Swift] 구조체와 클래스(Structures and Classes) (0) | 2023.02.08 |
---|---|
[Swift] 열거형(Enumerations) (0) | 2023.01.16 |
[Swift] 콜렉션(Collection) 타입 (3) - 딕셔너리(Dictionary) (0) | 2022.12.27 |
[Swift] 콜렉션(Collection) 타입(2) - 집합(Set) (0) | 2022.12.27 |
[Swift] 콜렉션(Collection) 타입(1) - 배열(Array) (0) | 2022.12.27 |