6.1 옵셔널 타입 선언과 정의

옵셔널은 값이 있을 수도, 없을 수도 있음을 나타내는 표현합니다.

값이 없다는 것은 nil로 나타내고 타입에 ?를 추가하면 Optional 타입으로 선언 할 수 있습니다.

var myName: String = "dino"
// error: MyPlayground.playground:2:10: error: 'nil' cannot be assigned to type 'String'
myName = nil
var myName: String? = "dino" // String? 대신 Optional<String>으로 할 수 있음
print(myName) // Optional("dino")
myName = nil
print(myName) // nil
func checkOptionalValue(value optionalValue: Any?){
    switch optionalValue {
    case .none:
        print("This Optional variable is nil")
    case .some(let value):
        print("Value is \\(value)")
    }
}

var myName: String? = "dino"
checkOptionalValue(value: myName) // Value is dino

myName = nil
checkOptionalValue(value: myName) // This Optional variable is nil

6.2 옵셔널 값 처리

6.2.1 옵셔널 강제 해제

간단하지만 런타임 오류가 일어날 가능성이 높기 때문에 위험한 방법

옵셔널 값 뒤에 !를 추가하면 강제로 추출하여 반환

만약 nil이라면 런타임 오류 발생

var myName: String? = "dino"

var dino: String = myName!

myName = nil
dino = myName! // 런타임 오류 발생

6.2.2 옵셔널 바인딩

옵셔널에 값이 있다면 추출한 값을 일정 블록 안에서 사용할 수 있는 상수나 변수로 할당해서 옵셔널이 아닌 값으로 사용할 수 있도록 해주는 기능

if let이라고도 부름

var myName: String? = "dino"

// 옵셔널 바인딩을 통한 임시 상수 할당
if let name = myName {
    print("My name is \\(name)")
} else {
    print("myName == nil")
}
// My name is dino

var yourName: String? = nil

// ,를 통해 여러개 상수를 선언 할 수 있음
if let name = myName, let friend = yourName {
    print("We are friend!")
}

yourName = "eric"
if let name = myName, let friend = yourName {
    print("We are friend! \\(name) & \\(friend)")
}
// We are friend! dino & eric

6.2.3 컴파일러에 의한 옵셔널 자동 해제

비교연산자를 사용 했을 때 따로 언랩핑 하지 않아도 자동으로 언랩핑으로 계산됨