조앤의 기술블로그
[Swift] 옵셔널 체이닝 (Optional Chaining) 본문
옵셔널 체이닝(Optional Chaining)이란, 사슬(chain)이 연결된 것처럼 옵셔널이 연달아 호출된 것을 의미합니다.
결론적으로,
- 옵셔널 체이닝의 결과는 항상 옵셔널 입니다.
- 옵셔널 체이닝이 포함된 표현식 중에서 하나라도 nil을 return한다면, 이어지는 표현식을 평가하지 않고 nil을 return합니다.
[예제]
Struct Contacts {
var phone: [String: String]
var address: String
func printAddress() {
return print(address ?? "No address")
}
}
Struct Student {
var name: String
var contacts: Contacts
var studentNum: Int
init(name: String, phone: String, studentNum: Int) {
self.name = name
contacts = Contacts(phone: ["home": phone], address: "Seoul")
self.studentNum = studentNum
}
func getContacts() -> Contacts? {
return contacts
}
}
Contacts 구조체와 Student 구조체를 선언하고, 각 내부에 변수, 함수를 선언하였습니다.
이제 객체를 선언하고, 각 속성을 호출하여 상수에 저장해보겠습니다.
var s = Student(name: "Joanne", phone: "123-4567", studentNum: 201501)
let a = s.contacts.adddress //자료형 String
var optionlS: Student? = Student(name: "Joanne", phone: "123-4567", studentNum: 201501)
let b = optionalS?.contacts.address //자료형 String?
let c = optionalS?.contacts.studentNum //자료형 Int?
optionalS = nil
let d = optionalS?.contacts.address //자료형 String?
//nil return
선언된 객체의 address를 호출하였습니다. 속성을 호출하기 위해 점문법을 사용했습니다.
(생성자 초기화에서 "Seoul"로 초기화를 했기 때문에 값이 있다면 "Seoul"이 호출됩니다.)
각 상수의 자료형은 String, String?, String?이고, 상수 c의 값은 nil이 return됩니다.
여기서 점문법에 옵셔널 표현식을 포함하고 있는 상수 b, c, d가 옵셔널 체이닝입니다.
옵셔널 체이닝의 특징을 서술하면,
- 옵셔널 체이닝이라고 모든 표현식이 옵셔널인 것은 아닙니다. 하나라도 옵셔널 표현식을 표현하고 있으면 옵셔널 체이닝입니다.
let a = s.contacts.address //옵셔널 체이닝이 아닙니다.
let b = optionalS?.contacts.address //옵셔널 체이닝입니다.
- 자료형의 타입은 마지막 표현식으로 결정됩니다. (String, Int) 그리고 항상 옵셔널로 리턴됩니다. (표현식에 하나라도 옵셔널이 포함되어 있다면)
let b = optionalS?.contacts.address //마지막 address가 String이므로 자료형은 String?입니다.
let c = optionalS?.contacts.studentNum //마지막 studentNum가 Int이므로 자료형은 Int?입니다.
- 중간에 nil값이 있다면 nil로 평가하고 그 이후 값부터는 평가하지 않습니다.
- 그래도 자료형 리턴값은 마지막 표현식으로 평가합니다.
'Study > Swift' 카테고리의 다른 글
[Swift] guard Statement (guard문) (0) | 2020.02.16 |
---|---|
[Swift] Structures and Classes (구조체와 클래스) (0) | 2020.02.16 |
[Swift] 클로저 (Closure) (0) | 2020.02.16 |
[Swift] 옵셔널 바인딩 (Optional Binding) (1) | 2020.02.14 |
[Swift] 옵셔널 (Optional) (0) | 2020.02.13 |