Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- switch
- setstate
- changenotifier
- 문법
- consumer
- snackbar
- reference
- user
- globalkey
- Firebase
- Stream
- borderRadius
- transform
- divider
- permission
- platformexception
- swift 문법
- datetime
- Camera
- runTransaction
- provider
- signout
- changenotifierprovider
- Navigator
- enum
- Snapshot
- ListView.builder
- Swift
- multiprovider
- controller
Archives
- Today
- Total
코딩하는 제리
[Swift} 옵셔널 체이닝(Optional Chaining) 본문
- .(dot)을 통해 내부 프로퍼티나 메서드에 연속적으로 접근할 때 옵셔널 값이 하나라도 껴 있으면 옵셔널 체이닝.
- 옵셔널 표현식의 멤버에 접근할 때, 표현식이 nil일 수 있으니 ?를 써줌.
- jerry?.contacts.email 에서 단 하나의 표현식이라도 nil이라면 nil을 반환함.
옵셔널 체이닝 특징
1. 옵셔널 체이닝 결과값의 타입은 마지막 표현식의 옵셔널 타입이다.
a. email에 닿기 전에 jerry가 nil이면 그냥 nil을 반환하기 때문에 무조건 옵셔널 타입이다.
2. 옵셔널 체이닝의 마지막 표현식은 옵셔널이라도 ?를 생략한다.
3. 옵셔널 체이닝의 표현식 중 하나라도 nil이라면, 이어지는 표현식은 평가하지 않고 nil을 리턴.
4. 함수가 끼어있는 옵셔널 체이닝
a. 함수의 리턴 값이 Optional인 경우에 함수를 호출하는 () 뒤에 ?를 붙여준다.
- jerry?.getContacts()?.email
b. 함수 자체가 옵셔널인 경우에는 함수를 호출하는 () 앞에 ?를 붙여준다.
- 리턴 타입이 Non-Optional Type이며 getContacts 함수를 담은 function이란 상수는 Optional Type인 경우
- function?().email
c. 함수 자체도 옵셔널, 리턴 값도 옵셔널 일 때 함수를 호출하는 앞 뒤로 ?()? 이렇게 붙여준다.
- function?()?.email
5. 딕셔너리가 껴있는 옵셔널 체이닝 (함수 옵셔널 체이닝이랑 같다)
a. key를 통해 value를 얻을 때 해당 key가 없을 수도 있기 때문에 무조건 Optional Type으로 리턴한다.
- dic["name"]?.count
- value의 속성에 접근할 땐 무조건 옵셔널 체이닝을 해줘야함.
b. 딕셔너리 타입 자체가 옵셔널인 경우
- dic?["name"]?.count
struct Contacts {
var email: String
var address: [String: String]
}
class Person {
var name: String
var contacts: Contacts
init(name: String, email: String, address: String) {
self.name = name
contacts = Contacts(email: email, address: ["home" : address])
}
}
var jerry: Person? = Person(name: "jerrycho", email: "jerry@naver.com", address: "busan")
// 옵셔널 체이닝
print(jerry?.contacts.email)
예제
class Person {
var name: String?
var age: Int?
var sns: SNS? = SNS()
}
class SNS {
var fb: FaceBook? = FaceBook()
var tt: Twitter? // nil
}
class FaceBook {
var account: String = "aaa@bbb.com"
}
class Twitter {
var account: String = ""
}
let p = Person()
// 옵셔널 체이닝 + 옵셔널 바인딩
if let account = p.sns?.fb?.account {
print(account)
} else {
print("nil")
}
// 옵셔널 체이닝 + 강제 언래핑
print((p.sns?.fb?.account)!)
// nil
print(p.sns?.tt?.account)
// crash
print(p.sns!.tt!.account)
'iOS > SwiftUI' 카테고리의 다른 글
[Swift] Generic 제너릭 (0) | 2022.01.12 |
---|---|
[Swift] Error Handling (Exeption Handling) (0) | 2022.01.12 |
[Swift] protocol (0) | 2022.01.12 |
[Swift] 접근 제어 (0) | 2022.01.12 |
[Swift] extension (0) | 2022.01.12 |
Comments