'체이닝'에 해당되는 글 1건

  1. 2017.07.06 옵셔널 체이닝 (2)

옵셔널 체이닝

옵셔널 체이닝은 옵셔널의 내부의 내부의 내부로 옵셔널이 연결되어 있을 때 유용하게 활용할 수 있습니다. 매 번 nil 확인을 하지 않고 최종적으로 원하는 값이 있는지 없는지 확인할 수 있습니다. 


소스코드


예제 클래스

class Person {
    var name: String
    var job: String?
    var home: Apartment?
    
    init(name: String) {
        self.name = name
    }
}

class Apartment {
    var buildingNumber: String
    var roomNumber: String
    var `guard`: Person?
    var owner: Person?
    
    init(dong: String, ho: String) {
        buildingNumber = dong
        roomNumber = ho
    }
}


옵셔널 체이닝 사용

let yagom: Person? = Person(name: "yagom")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")


// 옵셔널 체이닝이 실행 후 결과값이 nil일 수 있으므로
// 결과 타입도 옵셔널입니다

// 만약 우리집의 경비원의 직업이 궁금하다면..?

// 옵셔널 체이닝을 사용하지 않는다면...
func guardJob(owner: Person?) {
    if let owner = owner {
        if let home = owner.home {
            if let `guard` = home.guard {
                if let guardJob = `guard`.job {
                    print("우리집 경비원의 직업은 \(guardJob)입니다")
                } else {
                    print("우리집 경비원은 직업이 없어요")
                }
            }
        }
    }
}

guardJob(owner: yagom)

// 옵셔널 체이닝을 사용한다면
func guardJobWithOptionalChaining(owner: Person?) {
    if let guardJob = owner?.home?.guard?.job {
        print("우리집 경비원의 직업은 \(guardJob)입니다")
    } else {
        print("우리집 경비원은 직업이 없어요")
    }
}

guardJobWithOptionalChaining(owner: yagom)
// 우리집 경비원은 직업이 없어요



yagom?.home?.guard?.job // nil

yagom?.home = apart

yagom?.home // Optional(Apartment)
yagom?.home?.guard // nil

yagom?.home?.guard = superman

yagom?.home?.guard // Optional(Person)

yagom?.home?.guard?.name // superman
yagom?.home?.guard?.job // nil

yagom?.home?.guard?.job = "경비원"




nil 병합 연산자

중위 연산자입니다. ??

예) Optional ??  Value


옵셔널 값이 nil일 경우, 우측의 값을 반환합니다. 

띄어쓰기에 주의하여야 합니다.

var guardJob: String
    
guardJob = yagom?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 경비원

yagom?.home?.guard?.job = nil

guardJob = yagom?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 슈퍼맨



관련문서

* The Swift Programming Language - Optional Chaining

* The Swift Programming Language - Basic Operators - Nil-Coalescing Operator





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓ 블로거에게 공감은 큰 힘이 됩니다 ↓↓↓ 

'Swift > 기본문법' 카테고리의 다른 글

assert와 guard  (0) 2017.07.13
타입캐스팅  (2) 2017.07.10
옵셔널 체이닝  (2) 2017.07.06
인스턴스의 생성과 소멸  (0) 2017.07.03
상속  (0) 2017.06.29
프로퍼티 - Property  (2) 2017.06.26
Posted by yagom

댓글을 달아 주세요

  1. sesdesa 2017.07.24 14:31  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님 다름이 아니라 하나 이해가 되지 않는 것이 있어서 이렇게 글을 남깁니다.

    yagom?.home 으로 접근하는 것과
    yagom!.home 으로 접근하는 것의 차이점이 무엇인가요!?
    !를 사용한 것은 강제로 언랩핑하여 내부 프로퍼티에 접근하는 방법인데
    위의 예제에선 yagom.home  이 아닌 yagom?.home이 되는 것인가요?
    그리고
    type(of: yagom)
    type(of: yagom!)
    이 둘의 출력 결과물은 각각
    Optional(Person)
    Person
    인데

    type(of: yagom?)
    은 에러가 나더라구요...!

    이유가 무엇인가요?

    [자문자답]
    일단 첫번째에서 ? 와 ! 로 값을 얻어내는 것에선 만일 값이 존재하지 않을 때 ? 는 nil을 반환하는 반면 !는 에러를 발생시키더라구요.
    ?로 접근하는 것이 더 안전할 것 같습니다!
    두번째의 이유는 저것이 타입이 아니라 ?을 붙임으로써 문법의 종류가 되버려서 같은데 그 맞는 이유인가요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2017.07.24 16:29 신고  댓글주소  수정/삭제

      안녕하세요 sesdesa님,
      질문주신 내용과 답변 맞습니다.
      마지막 질문에 대해서는 포스팅 중에 '옵셔널'을 참고하시면 조금 더 정확한 답을 찾으실 수 있지 않을까 합니다 :)