옵셔널 정리 거의 다 왔어요! 좀만 더 힘내서 해봅시당
본 글은 인프런의 iOS 개발을 위한 swift% 완번 가이드를 기반으로
정리한 글임을 참고 부탁드려요!!
그럼 Optional Chaining이란 무엇일까요??
옵셔널을 연달아서 호출하는 것을 의미해요.
여기서는 두 가지만 기억하시면 돼요!
첫번째, 옵셔널 체이닝의 결과는 옵셔널이다.
두번째, optional chaining에 포함된 표현식 중에서 하나라도 nil을 return한다면,
이어지는 표현식을 평가하지 않고 nil을 return 한다.
첫 번째부터 확인해봅시당
struct Contacts {
var email: [String: String]
var address: String
}
struct Person {
var name: String
var contacts: Contacts
init(name: String, email: String) {
self.name = name
contacts = Contacts(email: ["home" : email], address: "Seoul")
}
}
이메일과 주소 정보를 저장하는 Contacts 구조체와
이름과 연락처(Contacts의 구조체로 선언됨) 정보를 저장하는 Person 구조체 2개를 선언했어요.
먼저 여기서, 옵셔널이 아닌 일반적인 값을 추출해서 확인해봅시다.
p라는 변수를 Person 타입으로 선언하고, address를 a에 저장해서 추출해봤어요.
"."를 이용해서 이어서 값을 추출해보았습니다.
처음에 초기화한 값 그대로 Seoul이 추출되고, type도 정상적인 타입으로 추출되네요!
그럼이제 옵셔널로 선언하고 확인해봅시다.
옵셔널 변수 똑같은 값을 b라는 변수로 생성하면 에러가 발생하네요.
무슨 에러인지 확인해봅시당
해석하면,
contacts 속성에 접근할려면 반드시 optionalP 인스턴스를 언래핑해야 한다.
?를 사용해서 체인으로 연결하거나 !를 사용해서 강제로 추출하세요.
근데 !는 강제 추출로 좋지 않은 추출법이니 추천하지 않아요.
?를 사용해서 체인으로 연결해서 추출해본다면,
init 값인 address가 잘 추출되고,
앞에서 말했듯이 타입이 옵셔널 String인 것을 확인할 수 있어요.
그럼 OptionalP에 nil을 넣으면요??
똑같이 값은 nil이지만, 타입은 Optinal 타입입니다.
왜 String이냐면, String으로 선언한 address 값을 가져왔기 때문이겠죠??
그게 중요한게 아니니, 여기서는 Optinal이 리턴된다를 확인해주시면 돼요.
* 근데 여기서 만약에 리턴하는 걸 값이 아니라 함수를 하나 만들고
함수에 리턴값을 없게 만든다면, 타입이 ()? void optional이 될거에요.
이거는 함수가 사용됐는지(binding유무) 아닌지를 알 수 있는 나름 유용한 경우랍니다..
쉽게 말하면, 표현식을 "."를 기준으로 쪼갰을 때 옵셔널이 있다면
리턴 값은 무조건 옵셔널이라는걸 기억하시면 돼요!!
그럼 여기서 맨 처음에 선언한 contacts 속성을 옵셔널로 바꿔봅시다.
Contacts를 옵셔널 타입으로 선언해보는거에요.
struct Contacts {
var email: [String: String]
var address: String
}
struct Person {
var name: String
var contacts: Contacts? // 옵셔널로 변경
init(name: String, email: String) {
self.name = name
contacts = Contacts(email: ["home" : email], address: "Seoul")
}
}
그러면 에러들이 왕창 발생해요.
무슨 에러냐면, 이제 contacts가 옵셔널이기 때문에 optionalP와 같이
옵셔널 속성에 접근할 때는, ?와 !를 사용해야한다는 에러에요.
?를 붙여서 값을 확인하고 타입을 확인해보면
a, b, c 모두가 옵셔널 String이네요!
왜냐? .를 기준으로 표현식에 옵셔널이 추가되었기 때문이에요.
이 예제들은 optional이 포함되어 있다면 무조건 옵셔널로 리턴된다는
것을 기억하기 위해서 한 예제들이에요. <- 위에서 말한 첫번째로 기억해야 하는것!!
그리고 여기서 중요한건, 함수나 메서드에도 똑같이 적용된다는 거에요.
옵셔널로 선언된 함수가 메서드가 리턴하는 값에 접근할 때는
(), 괄호 뒤에 물음표를 붙여서 추출합니다.
정말 정말 마지막으로 하나만 더 확인해봅시다.
둘 다 옵셔널 체이닝 이지만,
첫번째는 모든 표현식이 nil이 아닌것에 비해 두번째는 optionalP가 nil이기 때문에,
optionalP 뒤 표현식을 평가하지 않고 바로 종료합니다.
그렇기 때문에 address 속성에도 접근하지 못해서 값 저장도 안 되었고,
그래서 값을 저장한다고 저렇게 코드를 써도 아무런 의미가 없는 코드이기 때문에
값을 다시 출력해도 nil이 출력된 거에요!
이게 바로 위에서 기억해야 하는 두번째입니다.
optional chaining에 포함된 표현식 중에서 하나라도 nil을 return한다면,
이어지는 표현식을 평가하지 않고 nil을 return 한다. <- 이거에요!
마무리
사실 별거 없긴한데.. 헷갈릴 수도 있으니까 정리해보았습니다.
정리해보자면 기억해야 하는 것 2가지!
1. 옵셔널 체이닝의 결과는 옵셔널이다.
2. optional chaining에 포함된 표현식 중에서 하나라도 nil을 return한다면, 이어지는 표현식을 평가하지 않고 nil을 return 한다.
그리고,
옵셔널 체이닝을 위해서 값을 저장하는 규칙은
옵셔널 체이닝을 통해서 최종 속성까지 접근했다면 값을 저장하고,
접근하지 못하고 중간에 종료되었다면 아무런 변화도 없다는 것입니다.
'Swift > Swift 기초문법' 카테고리의 다른 글
[Swift 기초문법] Property를 알아보자 (0) | 2023.06.16 |
---|---|
[Swift 기초문법] Closure 를 알아보자 (2) | 2023.06.16 |
[Swift 기초문법] Optional Binding을 알아보자 (3) | 2023.02.26 |
[Swift 기초문법] Optional을 알아보자 (2) | 2023.02.11 |
[Swift 기초문법] Guard문을 알아보자 (0) | 2023.02.08 |