조앤의 기술블로그

[Swift] 옵셔널 바인딩 (Optional Binding) 본문

Study/Swift

[Swift] 옵셔널 바인딩 (Optional Binding)

쬬앤 2020. 2. 14. 23:27

옵셔널 바인딩이란 옵셔널을 안전하게 처리하는 방법입니다. 

옵셔널 값은 랩에 쌓여 있어서, 사용하기 위해서는 unwrapping하는 과정이 필요합니다.

 

!키워드를 사용하여 forced unwrapping을 할 수 있습니다.

하지만 이 경우에는 crash가 발생할 위험이 있으므로 (옵셔널이 nil값을 가질 때)

사용에 주의해야 합니다

 

하지만 그렇다고 해서, 이렇게 코드를 작성하지는 않습니다. 

if num != nil {
    print(num!)
} else ....
//이렇게 코드를 작성하지는 않습니다. 

대신 옵셔널 바인딩(optional binding)을 사용합니다. 

 

<Optional Binding>

if문, while문, guard문에서 사용합니다. 

기본 syntax입니다. 

//if 문
if let name: Type = OptionalExpression {
    Statements
}

//while문
while let name: Type = OptionalExpression {
    Statements
}

//guard문
guard let name: Type = OptionalExpression else {
    Statements
    //바인딩에 실패할 경우 else블록이 실행된다.
}

Binding은 옵셔널 표현식을 평가하여, 값을 리턴할 수 있으면 (즉, 값이 저장되어 있으면) unwrapping되어서 상수에 저장됩니다. 

값을 리턴하는 경우에만 (값을 저장하는 경우에만) unwrapping하기 때문에 crash의 위험이 없습니다. 

 

- 예제1

if let n = num {
    print(n)
} else {
}

num의 자료형은 Int? 이고, n의 자료형은 Int입니다. 

if let num = num {
    print(num)
}

보통 상수의 이름과 OptionalExpression의 이름은 같은 이름을 사용합니다.

 

- 예제 2

바인딩한 상수는 else 블록 내부에서는 사용할 수 없고, else블록 다음부터 사용가능합니다. 

var str: String? = "Hello"

guard let str = str else {
    //str //error
    fatalError()
}
str 

 

- 예제 3

하나의 문장에서 여러 바인딩을 할 때의 예제입니다. 

let a: Int? = 123
let b: String? = "str"

if let num = a, let str = b, str.count > 5 {
    print(num)
    print(str)
}

모든 바인딩이 성공할 때 if 블록이 수행되고, str.count > 5 처럼 condition을 추가할 수도 있습니다. 

 

 

 

참고: KxCoding.com

(정말 좋은 강의자료들이 있습니다. swift언어를 학습하시는 분들이라면 꼭 추천드립니다. 유튜브에 검색하셔도 나와요. 공부할 때 많은 도움을 받았습니다. )