검색결과 리스트
2015/09/11에 해당되는 글 1건
- 2015.09.11 [swift2] Swift Guard
글
[swift2] Swift Guard
Guard 문을 이해하기 쉽게 설명하고 있는 글을 발견하여 소개합니다. 원문을 조금 의역하고 예제를 수정했습니다.
원문: Swift's Guard
Swift2.0에 추가된 guard 구문은 멋집니다. 실 세계에서 가드가 하는 것과 같은 유사한 역할을 하지요. 학교 경비는 학교에 소속된 학생들만 교문을 입장하도록 허용합니다. 소속되지 않는 학생이 들어오려고 하면, 저지하고 되돌려 보냅니다. guard 문은 뒤따르는 조건이 충족되지 않을 경우, 로직실행을 멈추고 함수를 반환합니다.
guard 문의 사용법에 대해 몇가지 알아보겠습니다.
1. 함수안에서 Guard
- 함수 안에서 guard 문은 올바른 입력에 대해서만 함수의 실행을 허용합니다.
func guardInFunction(string: String?) {
guard string != nil else { return }
print(string!, "second param", separator: " ", terminator: "\n")
}
guardInFunction("test")
guardInFunction(nil)
위 함수는 nil 입력을 가드합니다. 만일 입력이 nil이면 guard문은 else 절을 수행하고 다른 구문이 수행되기 전에 함수를 return합니다.
2. 옵셔널 바인딩(Optional Binding)
옵셔널 바인딩을 guard문과 조합하여 사용하면, 이전의 코드를 다음과 같이 재작성 할 수 있습니다.
func guardWithOptionalBinding(string: String?) {
guard let letString = string else { return }
print(letString, "second param", separator: " ", terminator: "\n")
}
guardWithOptionalBinding("test")
인자 string이 nil이면 else 절을 수행하고 그렇지 않으면 함수는 정상흐름을 계속하고, string을 출력합니다. if-let 문법을 사용한 옵셔널 바인딩을 사용해봤다면 무엇인가 다르다는 것을 느낄수 있을 것입니다. 옵셔널 바인딩된 상수를 조건문 범위 바깥에서도 사용할 수 있습니다. if-let의 경우에는 if문 조건을 만족하는 경우 if 블럭 내부에서만 사용할 수 있습니다.
guard 문의 경우에 조건이 true이면, 상수의 사용범위는 함수의 나머지 영역이 됩니다. guard문 이후 어디에서라도 사용할수 있습니다.
3. 복합 옵셔널 바인딩(Compound Optional Binding)
다음 예제처럼 복합해서 옵셔널 바인딩을 사용할 수 있습니다. 모든 파라미터가 nil이 아닐경우에 조건을 충족하고 출력문을 수행할 수 있습니다.
func guardWithCompoundOptionalBinding(firstName: String?, lastName:String?, dateOfBirth:String?, country:String? ) {
guard let fname = firstName, let lname = lastName, let dob = dateOfBirth, let cnt = country else { return }
print("\(fname) \(lname) \(dob) \(cnt)", separator: "", terminator: "\n")
}
guardWithCompoundOptionalBinding("sungbae", lastName: "kim", dateOfBirth: "", country: "korea")
4. 제어흐름 이동(Transferring Control)
위 예제에서 주목할 만한 것은, 조건이 충족되지 않으면 함수로부터 반환되는 것입니다. 이것은 guard 문이 조건을 만족하지 않으면 제어흐름의 이동시키는 구문을 가져야 하기 때문입니다. 위 예제에서 우리는 return문을 사용했습니다. 루프의 경우에는 continue와 break를 사용할 수 있습니다. 또한 우리는 error를 throw 할 수 있습니다. 예제를 보겠습니다.
func guardTransferringControl() {
var strings:Array<String> = ["Safe", "Coding", "why", "using", "guard", "statement"]
for string in strings {
guard string != "why" else {
continue
}
print("string", separator: "", terminator: "\n")
}
}
guardTransferringControl()
조건문을 만족하지 않으면, else 구문에서 제어흐름을 이동시키기 위해 continue를 사용했습니다.
이것이 guard 문이 하는 일입니다.
'Swift' 카테고리의 다른 글
| [swift2] 타입변환 연산자 (is, as, as?, as!) (0) | 2015.10.18 |
|---|---|
| [swift] Swift 코딩환경 Playground (0) | 2015.10.05 |
| [swift2] Swift Guard (0) | 2015.09.11 |
| [swift2] Swift2에서의 문자열(strings) (0) | 2015.09.02 |
| [swift2] Xcode7 beta6 Swift 언어 변경사항 (0) | 2015.08.27 |
| [swift2] Xcode7 beta5 Swift 언어 변경사항 (0) | 2015.08.14 |