어플리케이션이 동작 도중에 생성하는 다양한 결과값을 동적으로 확인하고 안전하게 처리할 수 있도록 한다.
assert 함수는 디버깅 모드에서만 동작하며, 주로 디버깅 중 조건의 검증을 위해 사용한다.
var someInt: Int = 0
assert(someInt == 0, "someInt != 0")
assert함수의 someInt == 0
조건이 맞으면 아래 줄로 넘어가지만, 아니라면 "someInt != 0"
메시지를 띄우고 동작을 중지시킨다. 이 메시지는 편의에 따라 적어도 되고 안 적어도 된다.
guard 키워드를 사용하면 잘못된 값이 전달될 시 특정 실행구문을 빠르게 종료한다. 디버깅 모드 뿐 아니라 어떤 조건에서도 동작한다.
else 블럭과 꼭 함께 쓰여야 하고, 빠른 종료를 위한 구문이기 때문에 else 블럭 내부에는 특정 코드블럭을 종료하는 지시어(return, break 등)가 꼭 있어야 한다.
guard let unwrappedAge = age,
unwrappedAge < 130,
unwrappedAge >= 0 else {
print("나이값 입력이 잘못되었습니다")
return
}
print("당신의 나이는 \(unwrappedAge)세입니다")
let으로 언래핑해서 옵셔널바인딩을 먼저 실행하면 age가 nil일 경우 바로 return된다. nil이 아니라면 unwrappedAge < 130과 unwrappedAge >= 0 조건을 검사하고, 조건에 부합하지 않는다면 else로 들어와 return된다.
if let 구문과는 달리 guard let은 블럭을 벗어나도 unwrappedAge 변수를 계속 사용할 수 있다.
var count = 1
while true {
guard count < 3 else {
break
}
print(count)
count += 1
}
반복문과도 함께 쓰일 수 있다.
딕셔너리에서 값을 꺼내면 항상 옵셔널이기 때문에 주로 딕셔너리와 함께 자주 사용된다.
func someFunction(info: [String: Any]) {
guard let name = info["name"] as? String else { // ①
return
}
guard let age = info["age"] as? Int, age >= 0 else { // ②
return
}
print("\(name): \(age)")
}
someFunction(info: ["name": "jenny", "age": "10"])
someFunction(info: ["name": "mike"])
someFunction(info: ["name": "yagom", "age": 10]) // yagom: 10
① info["name"]
은 값이 있다면 Any타입이기 때문에 String타입으로 한 번 캐스팅해주고, 정상 값이라면 name에 값이 반환된다. 그렇지 않다면 return되어 빠르게 종료된다.
② 마찬가지로 Int타입으로 캐스팅해주고, 이 경우는 age에 반환된 값을 age >= 0
으로 한 번 더 검증한다. 조건을 만족하지 못하면 return된다.
야곰의 스위프트 기본 문법 강좌를 수강하며 작성한 내용입니다.