애플리케이션이 동작 도중에 생성하는 다양한 연산 결과값을 동적으로 확인하고
안전하게 처리할 수 있도록 확인하고 빠르게 처리할 수 있음
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를 사용하여 잘못된 값의 전달 시 특정 실행구문을 빠르게 종료
•디버깅 모드 뿐만 아니라 어떤 조건에서도 동작
•guard의 else 블럭 내부에는 특정 코드블럭을 종료하는 지시어(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"] as? String else { return } guard let age = info["age"] as? Int, 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
공감은 로그인이 필요없습니다.
공감은 저에게 포스팅을 이어나갈 수 있는 힘이 됩니다.
'프로그래밍 [KOR] > Swift' 카테고리의 다른 글
Swift의 익스텐션(Extension) (0) | 2018.10.19 |
---|---|
Swift의 프로토콜(Protocol) (0) | 2018.10.19 |
Swift의 타입 캐스팅 (0) | 2018.10.17 |
Swift의 옵셔널 체이닝과 nil 병합 연산자 (0) | 2018.10.17 |
Swift의 인스턴스의 생성과 소멸 (0) | 2018.10.15 |