옵셔널

  • 옵셔널이란? 어떠한 값도 없는 상태로 변수만 선언되어 있으며, 아직 인스턴스(객체)가 할당되기 전이다.
  • 값이 있을 수도 있고 없을 수도 있다.
  • 빈 값이 아니라 아예 값이 없는 것이다.
var name: String = ""
//빈 값이 존재

var number: Int = 0
//마찬가지로 0이라는 값이 존재
//고로 위의 두 변수는 모두 nil이 아니다.

optional

var name: String?
  • 이처럼 타입 뒤에 ?를 붙여 옵셔널 타입으로 선언한다.
var name: String? //Optional(String) 타입
var name2: String = name //String 타입
//서로 타입이 다르므로 위의 경우는 에러가 발생

언랩핑

  • 언랩핑이란? 옵셔널 변수에 값이 있음을 확인하여 일반 변수로 전환해주는 것

언랩핑의 종류

  • 명시적 옵셔널 해제 (강제 해제, 옵셔널 바인딩, 컴파일러에 의한 강제 해제)
  • 묵시적 옵셔널 해제

명시적 옵셔널 해제 - 강제 해제

  • 변수나 상수 뒤에 !를 붙여 강제 해재하는 방법
var num: Int? = 5

print(num) //Optional(5)
print(num!) //5

명시적 옵셔널 해제 - 옵셔널 바인딩

  • if 혹은 guard 구문을 통해 옵셔널 타입의 값을 일반 타입의 변수나 상수에 할당하는 방식
var num: Int? = 5 //Optional(5)

//if-let
if let num = num {
    print(num) //5
}

func check(num: Int?) {
    //guard-let
    guard let num = num else {
        print("nil")
        return
    }
    print(num)
}

print(check(num: num)) //5

컴파일러에 의한 강제 해제

  • 옵셔널 객체의 값을 비교 연산자를 사용하여 비교하는 경우에는 언래핑이 필요하지 않다.
var num: Int? = 123

//컴파일러에 의한 강제 해제
if num == 123 {
    print("num == 123") //num == 123
} else {
    print("num != 123")
}

묵시적 옵셔널 해제

  • 옵셔널 타입이지만, 값을 사용하려 할 때에는 자동으로 옵셔널이 해제된 값을 제공하기 때문에 굳이 ! 가 필요 없다.
var str: String! = "Swift"
print(str) //Swift

var value01: Int? = 10
value01 + 5 //에러

var value02: Int! = 10
value02 + 5 //15

옵셔널 체이닝 (Optional Chaining)

  • 옵셔널 체이닝을 사용하면 코드를 더 간결하게 쓸 수 있다.
  • 옵셔널 체이닝은 속성에 접근할 때 옵셔널 바인딩 과정을 ? 키워드로 줄여주는 역할을 한다.
let array: [String]? = []
var isEmptyArray = false

if let array = array, array.isEmpty {
    isEmptyArray = true
} else {
    isEmptyArray = false
}

isEmptyArray //true
let array: [String]? = []

//옵셔널 체이닝을 통한 접근
array?.isEmpty //true