[Swift] Assert와 Guard

김형근·2024년 7월 23일

[Swift] 문법

목록 보기
16/20

🍎 [Swift] Assert와 Guard

  • Swift에서 애플리케이션이 동작 도중 생성하는 다양한 결과값을 확인하고, 안전하게 처리하기 위해 assertguard 를 사용합니다.

🍏 Assert

  • assert 는 디버깅 모드에서만 동작하며, 특정 조건이 참인지 확인합니다.
    조건이 거짓이면 프로그램이 중지됩니다.

디버깅 중 조건 검증을 위해 주로 사용되며, 배포 버전에는 제외됩니다.

var someInt: Int = 0

// someInt가 0인지 확인
assert(someInt == 0, "someInt != 0")  // 조건이 만족되므로 통과

someInt = 1
// assert(someInt == 0) // 동작 중지, 검증 실패
// assert(someInt == 0, "someInt != 0") // 동작 중지, 검증 실패

위의 예제에서 'someInt' 가 0인지 확인하고, 조건이 만족되지 않으면 프로그램이 중지됩니다.

🧃 함수에서의 사용 예시

func functionWithAssert(age: Int?) {
    // age가 nil이 아닌지 확인
    assert(age != nil, "age == nil")  // age가 nil이 아니어야 함
    
    // age가 0 이상 130 이하인지 확인
    assert((age! >= 0) && (age! <= 130), "나이값 입력이 잘못되었습니다.")  // 나이 범위를 확인
    print("당신의 나이는 \(age!)세 입니다.")
}

functionWithAssert(age: 50)  // 정상 동작, "당신의 나이는 50세 입니다." 출력
// functionWithAssert(age: -1) // 동작 중지, 검증 실패
// functionWithAssert(age: nil) // 동작 중지, 검증 실패

'functionWithAssert' 함수는 입력된 나이가 유효한지 검사하고,
유효하지 않으면 프로그램을 중지시킵니다.


🍏 Guard

  • 'guard' 는 특정 조건이 충족되지 않을 때 코드 블록을 빠르게 종료합니다.
    이는 디버깅 모드 뿐만 아니라 모든 실행 모드에서 동작하며,
    'return' , 'break' 등으로 코드 블록을 종료해야 합니다.

주로 옵셔널 바인딩과 타입 캐스팅에서 자주 사용됩니다.

func functionWithGuard(age: Int?) {
    // age를 언래핑하고, 유효한 나이 범위인지 확인
    guard let unwrappedAge = age,
          unwrappedAge < 130,
          unwrappedAge >= 0 else {
        print("나이값 입력이 잘못되었습니다.")
        return
    }
    
    print("당신의 나이는 \(unwrappedAge)세 입니다.")
}

functionWithGuard(age: 50) // 정상 동작, "당신의 나이는 50세 입니다." 출력
functionWithGuard(age: -1) // "나이값 입력이 잘못되었습니다." 출력 후 함수 종료
functionWithGuard(age: nil) // "나이값 입력이 잘못되었습니다." 출력 후 함수 종료

'functionWithGuard' 함수는 입력된 나이가 유효하지 않을 경우 빠르게 함수를 종료합니다.

🧃 반복문에서의 사용 예시

var count = 1

while true {
    // count가 3 미만인지 확인, 아니면 반복문 종료
    guard count < 3 else {
        break
    }
    print(count)
    count += 1
}

// 출력 결과
// 1
// 2

'guard' 를 사용하여 'count' 가 3 미만일 때만 반복을 계속하고, 그렇지 않으면 반복문을 종료합니다.

🧃 함수 내에서 조건부 실행 예시

func someFunction(info: [String: Any]) {
    // info 딕셔너리에서 name을 String으로 추출
    guard let name = info["name"] as? String else {
        return
    }
    
    // info 딕셔너리에서 age를 Int로 추출하고, 유효한 나이 범위인지 확인
    guard let age = info["age"] as? Int, age >= 0 else {
        return
    }
    
    print("\(name): \(age)")
}

someFunction(info: ["name": "jenny", "age": "10"]) // 아무 출력 없음 (age가 String)
someFunction(info: ["name": "mike"]) // 아무 출력 없음 (age 없음)
someFunction(info: ["name": "geuni", "age": 26]) // "geuni: 26" 출력

'someFunction' 함수는 딕셔너리에서 'name' 과 'age' 를 추출하여 유효한 경우에만 출력합니다.


profile
꾸준히 기록하기

0개의 댓글