Xcode 9.* 에서 Swift를 사용하는 경우 옵셔널 체인에 대해 살펴봅니다. #4

in #kr7 years ago (edited)

옵셔널 타입의 의도는 알겠지만(안정적인 코드를 위해 미리 미리 체크해야 한다는) 문제는 객체 안에 객체의 속성이 옵셔널로 되어 있다면 이런 경우 하나의 값을 빼내기 위해서 옵셔널 바인딩을 여러번 처리해야 한다는 문제가 생깁니다.
예를 들면 Human구조체의 name이 옵셔널 문자열 타입이라면 if let, if let을 중첩해서 사용해서 nil이 아닌지를 체크하고 접근해야 합니다.

import UIKit

struct Human {
    var name : String?
    var man : Bool = true
}

var boy : Human? = Human(name: "홍길동", man: true)

//안전성 검사를 하면서 값을 빼낸다면
if boy != nil {
    if boy!.name != nil {
        print("이름은 \(boy!.name!)입니다")
    }
}

//옵셔널 바인딩 구문을 사용한다면
if let b = boy {
    if let name = b.name {
        print("이름은 \(name)입니다")
    }
}

만약 Human구조체를 다른 구조체나 클래스가 프로퍼티로 사용한다면 코드가 좀 더 복잡해 집니다.

struct Company {
    var ceo : Human?
    var companyName : String?
}

var startup : Company? = Company(ceo: Human(name: "나대표", man: false),
    companyName:"멀티캠퍼스")

//옵셔널 타입을 해제하려면 
if let company = startup {
    if let ceo = company.ceo {
        if let name = ceo.name {
            print("대표이사의 이름은 \(name)입니다")
        }
    }
}

옵셔널 체인을 사용하면 Objective-C의 기본 특징중에 하나를 그대로 사용합니다. Objective-C에서는 nil인 객체에 메세지를 보내도 아무런 오류가 발생하지 않는다는 점입니다. 자바나 C#에서 NullPointException이 발생하는 것과 대조적입니다. 변수명?.변수명?.속성명 과 같이 간결하게 단번에 접근이 가능합니다.

if let name = startup?.ceo?.name {
    print("대표이사의 이름은 \(name)입니다")
}

스크린샷 2018-03-08 오후 5.38.52.png

Coin Marketplace

STEEM 0.17
TRX 0.16
JST 0.029
BTC 61224.26
ETH 2383.35
USDT 1.00
SBD 2.55