Swift optional에 대해 알아보자.

	var text1: String = "hi"
	var text2: String = nil

만일 위와같은 코드가 존재한다면 두번째라인에서 컴파일 에러가 날것이다.

objective-c 개발자는 당황하게 된다.

왜 옵셔널이란 것을 만들어서 nil값을 선언하는데 복잡하도록 하였을까?

Type Safety

기존 objective-c를 개발하며 가장 많이 겪었던 오류 중 하나가 바로 nil처리와 관련된 오류다.

null point exception과 같은 오류이다.

어떠한 value가 nil이 되어 해당 값을 사용하는 부분에서 문제가 발생하는 것인데

이를 방지하기위해 nil체크 관련 로직이 대부분 필수적으로 들어가게된다.

그러나

Swift는 type Safe한 언어이고, 위와같은 이슈를 사전에 방지하도록 되어있다.

해당 value가 nil을 사용할 적합성을 runtime딴에서 에러를 발생시켜 nil상황에 대한 판단 및 분기를 명확히 하도록 한다.(위 코드에러의 이유다)

그렇기에

optional이라는 것이 존재한다. (? 로 표기한다)

optional value는 해당 value 값이 없을 수 있음(nil일 수 있다)을 의미한다.

	var text1: String = "hi"
	var text2: String? = nil

위 코드의 text2는 ? 표기덕분에 nil일경우 runtime에러가 나지 않는다.

예시로 optional을 알아보자

func pizzaMachine (_ menu: String) -> String? {
    if(menu == "super"){
        return "super Pizza"
    }else if(menu == "cheeze"){
        return "super Cheeze"
    }
    
    return nil
}

var pizzaName: String = pizzaMachine("super")

위 코드의 마지막 코드에서 바로 컴파일 에러가 날것이다.

리턴값은 String?로 nil값일 수 있다는 표현으로 리턴되었는데 nil을 일반 value(String type)에 매핑하려 하기때문이다.

OptionalBinding

그렇기에 이를 safe 하게 분류(nil인지 아닌지)하기위해 optionalBinding을 해준다.

if let pizzaName = pizzaMachine("super"){
    print("my pizza is \(pizzaName)")
}else{
    print("no pizza//null")
}

위 코드로 인해 pizzaMachine의 값이 nil이 아니라면 my pizza ia super pizza을 출력할 것이고,

nil이라면 no pizza//null 을 출력할 것이다.

이러한 바인딩을 거치지 않고 ‘!`을 이용해 강제 추출(옵셔널을 벗길 수 있는)해 낼수 있는 방법이있다.

이러한 강제 추출은 명확히 값이 존재 할 경우에 optional을 명확히 하는데 그 의미가 있을 수 있지만 가급적 binding을 통하여 value를 추출하는것이 보다 safe할 것이다.