6.2.2 옵셔널 바인딩

앞에서 우리는 nil 체크 조건절을 통해 안전하게 옵셔널을 해제할 수 있었습니다. 이번에는 비강제적인 해제 구문으로 바꾸어 작성해 보겠습니다. 옵셔널 바인딩이라고 불리는 방식입니다.

var str = "Swift"

if let intFromStr = Int(str) {
    print("변환된 값은 \(intFromStr)입니다")
} else {
    print("값 변환에 실패하였습니다")
}

intFromStr이 상수로 선언되었고 이 상수는 옵셔널이 아닌 일반 타입입니다. 만약 Int(str)의 결과값이 nil이면 else구문이 실행되게 됩니다. 또 다른 예시를 살펴보겠습니다.

func intStr(str: String) {
    guard let intFromStr = Int(str) else {
        print("값 변환에 실패하였습니다")
        return
        
    }
    print("변환된 값은 \(intFromStr)입니다")
}

위는 guard 문을 사용해 옵셔널 바인딩을 구현한 예제입니다. 사용 용법은 앞선 if let 구문과 비슷하지만, guard 구문은 조건에 맞지 않으면 무조건 함수의 실행을 종료시키므로, 실행 흐름상 옵셔널 값이 해제되지 않으면 더 이상 진행이 불가능할 정도로 큰일이 생길 때에만 사용하는 것이 좋습니다.

옵셔널과 관련해서 앞에서 학습했던 딕셔너리를 살펴보겠습니다.

var capital = ["KR": "Seoul", "EN": "London", "FR": "Paris"]

print(capital["KR"])
print(capital["KR"]!)
// 실행 결과
Optional("Seoul")
Seoul

딕셔너리에 키로 접근하면 그 결과값은 옵셔널 타입으로 반환됩니다. 왜 딕셔너리는 옵셔널 타입의 값을 반환할까요? 딕셔너리에 키로 사용될 수 있는 값은 Hashable 프로토콜이 구현된 모든 자료형이라고 설명했습니다. 키 사용 제한이 거의 없으므로 존재하지 않는 키를 사용할 가능성이 있습니다. 이 경우 주어진 키에 값이 비어있거나 입력된 키가 아예 없다는 것을 표현하기 위해 nil을 반환해야 합니다. 위 코드를 아래와 같이 개선할 수 있습니다.

var capital = ["KR": "Seoul", "EN": "London", "FR": "Paris"]

if (capital["KR"] != nil) {
    print(capital["KR"])
}

// 또는

if let val = capital["KR"] {
    print(val)
}

Last updated