조앤의 기술블로그

[Swift] 옵셔널 체이닝 (Optional Chaining) 본문

Study/Swift

[Swift] 옵셔널 체이닝 (Optional Chaining)

쬬앤 2020. 2. 15. 21:11

옵셔널 체이닝(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로 평가하고 그 이후 값부터는 평가하지 않습니다. 

 

 

- 그래도 자료형 리턴값은 마지막 표현식으로 평가합니다.