본문 바로가기

프로그래밍 [KOR]/Swift

Swift의 assert와 guard

애플리케이션이 동작 도중에 생성하는 다양한 연산 결과값을 동적으로 확인하고 

안전하게 처리할 수 있도록 확인하고 빠르게 처리할 수 있음



1. Assertion


  •assert(_:_:file:line:) 함수를 사용

  •assert함수는 디버깅 모드에서만 동작

  •배포하는 애플리케이션에서는 제외됨

  •예상했던 조건의 검증을 위하여 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var someInt: Int = 0
 
// 검증 조건과 실패시 나타날 문구를 작성
// 검증 조건에 부합하므로 지나감
assert(someInt == 0"someInt !=0")
 
someInt = 1
//assert(someInt == 0) // 동작 중지, 검증 실패
//assert(someInt == 0, "someInt != 0") // 동작 중지, 검증 실패
// assertion failed: someInt != 0: file guard_assert.swift, line 26
 
 
func functionWithAssert(age: Int?) {
    
    assert(age != nil, "age == nil")
 
    assert((age! >= 0&& (age! <= 130), "나이값 입력이 잘못되었습니다")
    print("당신의 나이는 \(age)세 입니다")
}
 
functionWithAssert(age: 50)
//functionWithAssert(age: -1) // 동작 중지, 검증 실패
//functionWithAssert(age: nil) // 동작 중지, 검증 실패
cs


* assert(_:_:file:line:)와 같은 역할을 하지만 실제 배포 환경에서도 동작하는 precondtion(_:_:file:line:) 함수도 있음



2. guard(빠른종료- Early Exit)


  •guard를 사용하여 잘못된 값의 전달 시 특정 실행구문을 빠르게 종료

  •디버깅 모드 뿐만 아니라 어떤 조건에서도 동작

  •guardelse 블럭 내부에는 특정 코드블럭을 종료하는 지시어(return, break 등)가 꼭 있어야 함

  •타입 캐스팅, 옵셔널과도 자주 사용

  •그 외에도 단순 조건 판단 후 빠르게 종료할 때도 용이


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
func functionWithGuard(age: Int?) {
    
    guard let unwrappedAge = age,
        unwrappedAge < 130,
        unwrappedAge >= 0 else {
        print("나이값 입력이 잘못되었습니다")
        return
    }
 
    print("당신의 나이는 \(unwrappedAge)세 입니다")
}
 
var count = 1
 
while true {
    guard count < 3 else {
        break
    }
    print(count)
    count+=1
}
// 1
// 2
 
func someFunction(info: [String: Any]) {
    guard let name = info["name"asString else {
        return
    }
 
    guard let age = info["age"asInt, age >= 0 else {
        return
    }
 
    print("\(name): \(age)")
}
 
someFunction(info: ["name":"jennie""age","10"])
someFunction(info: ["name":"jisoo"])
someFunction(info: ["name":"rose""age"10]) // rose: 10
cs



** if let / guard 를 이용한 옵셔널 바인딩 비교 **


1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 1. if let 옵셔널 바인딩
if let unwrapped: Int = someValue {
// do something
    unwrapped = 3
}
// if 구문 외부에서는 unwrapped 사용이 불가능
// unwrapped = 5
 
// 2. guard 옵셔널 바인딩
// guard 구문 이후에도 unwrapped 사용 가능
guard let unwrapped: Int = someValue else {
    return
}
unwrapped = 3
cs







제 나름대로 생각을 정리하며 포스팅합니다.

정보전달에 있어 차질이 생기는 것을 우려해 나름대로 확실하게 검증을 하고 포스팅하려고 노력합니다.

본 포스팅에 잘못된 정보가 있거나 수정해야할 내용이 있다면 댓글 또는 아래의 이메일로 알려주시면 감사하겠습니다.

E-mail : silent_lhr@naver.com



공감은 로그인이 필요없습니다.

공감은 저에게 포스팅을 이어나갈 수 있는 힘이 됩니다.