본문 바로가기

프로그래밍 [KOR]/Swift

Swift의 옵셔널 체이닝과 nil 병합 연산자

1. 옵셔널 체이닝


  •옵셔널 체이닝은 옵셔널의 내부의 내부의 내부로 옵셔널이 연결되어 있을 때 유용하게 활용할 수 있음

  •매번 nil 확인을 하지 않고 최종적으로 원하는 값이 있는지 없는지 확인할 수 있음


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// 예제 클래스
// 사람 클래스
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 jinun: Person? = Person(name: "jinun")
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: jinun)
 
// 옵셔널 체이닝을 사용한다면
func guardJobWithOptionalChaining(owner: Person?) {
    if let guardJob = owner?.home?.guard?.job {
        print("우리집 경비원의 직업은 \(guardJob)입니다")
    } else {
        print("우리집 경비원은 직업이 없어요")
    }
}
 
guardJobWithOptionalChaining(owner: jinun)
// 우리집 경비원은 직업이 없어요
 
 
jinun?.home?.guard?.job // nil
 
jinun?.home = apart
 
jinun?.home // Optional(Apartment)
jinun?.home?.guard // nil
 
// 경비원 할당
jinun?.home?.guard?.name // superman
jinun?.home?.guard?.job // nil
 
jinun?.home?.guard?.job = "경비원"
cs



2. nil 병합 연산자


  •중위 연산자임 ??

  •Optional ?? Value

  •옵셔널 값이 nil일 경우, 우측의 값을 반환

  •띄어쓰기에 주의해야 함


1
2
3
4
5
6
7
8
9
var guardJob: String
 
guardJob = jinun?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 경비원
 
jinun?.home?.guard?.job = nil
 
guardJob = jinun?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 슈퍼맨
cs






제 나름대로 생각을 정리하며 포스팅합니다.

정보전달에 있어 차질이 생기는 것을 우려해 나름대로 확실하게 검증을 하고 포스팅하려고 노력합니다.

본 포스팅에 잘못된 정보가 있거나 수정해야할 내용이 있다면 댓글 또는 아래의 이메일로 알려주시면 감사하겠습니다.

E-mail : silent_lhr@naver.com



공감은 로그인이 필요없습니다.

공감은 저에게 포스팅을 이어나갈 수 있는 힘이 됩니다.


'프로그래밍 [KOR] > Swift' 카테고리의 다른 글

Swift의 assert와 guard  (0) 2018.10.18
Swift의 타입 캐스팅  (0) 2018.10.17
Swift의 인스턴스의 생성과 소멸  (0) 2018.10.15
Swift의 상속  (0) 2018.10.11
Swift의 프로퍼티 감시자  (0) 2018.10.11