[Swift] 옵셔널 체이닝 (Optional Chaining)

김상우·2021년 10월 28일
0

옵셔널 체이닝 vs 옵셔널 바인딩

  • 옵셔널 체이닝 (Optional Chaining)
    옵셔널에 속해있는, nil 일지도 모르는 프로퍼티, 메서드, 서브스크립션 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정
    -> ?, ! 키워드 사용
  • 옵셔널 바인딩
    옵셔널로 감싸있는 프로퍼티, 메서드, 서브스크립션 등의 옵셔널을 아예 벗겨버리는 과정
    -> if let, guard let 키워드 사용

Swift 예제 코드

  • 옵셔널 체이닝
  • 옵셔널 바인딩
// Optional Chaining
struct Developer {
    let name: String
}

struct Company {
    let name: String
    // 옵셔널 변수
    var developer: Developer?
}

var company = Company(name: "NKLKB", developer: nil)
company.developer   // nil

var developer = Developer(name: "Kim Sang Woo")
company.developer = developer
print(company.developer)
// -> Optional(__lldb_expr_72.Developer(name: "Kim Sang Woo"))

// print(company.developer.name) -> 옵셔널을 벗기지 않았기 때문에 오류 !

// 이럴때 옵셔널 체이닝이 필요 (물론 옵셔널 바인딩으로 할 수도 있음)
print(company.developer?.name)  // Optional("Kim Sang Woo")
print(company.developer!.name)  // Kim Sang Woo

// 옵셔널 체이닝으로 출력을 하면 Optional()이 묶인 채로 출력됨.
// 옵셔널을 아예 벗겨내고 싶다면 옵셔널 바인딩을 사용해야함.

// if let 옵셔널 바인딩
if let result = company.developer?.name {
    print("if let")
    print(result)   // KimSangWoo
}
else {
    print("nil")
}

// guard let else 옵셔널 바인딩
func optionalBinding(result: Any?) {
    guard let result = company.developer?.name else {
        print("nil")
        return
    }
    print("guard let")
    print(result)
}

optionalBinding(result: company.developer?.name)
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글