저번 포스팅에서 옵셔널이라는게 무엇인지, 왜 필요한지 알아보았습니다.
옵셔널은 Optional(값)으로 보호되고 있기 때문에 그대로 사용할 수가 없습니다.
옵셔널을 벗겨낸 뒤, 그 결과 남은 값을 사용할 수 있습니다.
옵셔널을 벗겨낼 수 있는 Optional Unwrapping 중 주로 사용하는 몇가지 방법에 대해 소개해 보겠습니다.
1. 강제 추출 (forced unwrapping)
느낌표(!)를 사용하여 강제로 벗겨내는 방법입니다.
이전 포스팅에도 소개했지만 컴파일, 런타임 오류가 발생하기 딱 좋은 방법이므로 정말 확신할 때가 아니고서는 사용을 지양합시다.
타입에 !를 붙여주면 암시적 추출 옵셔널 (Implicitly Unwrapped Optional)로 사용할 수 있습니다.
var someNumber: Int!
someNumber = 28
print(someNumber) // Optional(28)
print(someNumber!) // 28
2. 옵셔널 바인딩 (Optional Binding)
안전하게 옵셔널을 벗겨내는 방법을 옵셔널 바인딩 (Optional Binding)이라고 부릅니다.
그 중 if let, guard let을 많이 사용합니다.
- if let
옵셔널 값을 받아낼 상수를 만들어 nil이 아닌 경우 중괄호 내의 코드를 실행해 줍니다.
그러나 여기서 만든 상수는 해당 if문 내에서만 사용할 수 있습니다.
var someNumber: Int?
someNumber = 13
if let age = someNumber {
print(age)
} else {
print("입력한 나이가 없습니다.")
} // 13 출력. someNumber가 nil이라면 "입력한 나이가 없습니다."을 출력
- guard let
옵셔널 값을 받아낼 상수를 만들어 nil이 아닌 경우 그 다음의 코드를 실행해 줍니다.
nil인 경우 else를 작성하는데, 이곳에는 반드시 제어 전달문(Control Transfer Statement)을 사용해야 합니다.
var someNumber: Int?
someNumber = 13
func inputAge() {
guard let age = someNumber else {
return print("입력한 나이가 없습니다.")
}
print(age)
}
inputAge() // 13 출력. someNumber가 nil이라면 "입력한 나이가 없습니다."을 출력
- 제어 전달문 (Control Transfer Statement)
- break : 문장이 중첩되어 있을 때 가장 인접한 문장을 중지합니다.
- continue : 현재 실행중인 반복을 중지하고, 다음 반복을 실행합니다.
- return : func에서 다음 값을 반환해준다는 뜻입니다.
- fallthrough : switch에서 바로 다음에 있는 case도 같이 내려준다는 뜻입니다.
- throw : 오류 처리에서 다음 오류를 던져준다는 뜻입니다.
- (break or continue) Label이름 : 가장 인접한 문장이 아닌 원하는 문장을 제어하고 싶을 때 사용합니다.
Label: statement
// 문장 앞에 원하는 Label을 붙인다.
break Label이름
continue Label이름
// break, continue 뒤에 설정해놓은 Label을 적으면 된다.
4. 옵셔널 체이닝
옵셔널 체이닝은 연쇄적으로 프로퍼티, 메소드, 서브스크립트의 값이 nil인지 확인하는 과정입니다.
사용 시 ?를 붙여서 표현합니다.
하나라도 nil이 발견되면 전체 결과를 nil로 도출해줍니다.
person.contacts?.residence?.address
// contacts 또는 residence 값이 하나라도 nil이면 nil이고 둘 다 값이 있다면 address를 도출
5. nil 병합 연산자 (nil coalescing)
nil 병합 연산자는 ??로 표현합니다.
?? 앞의 값이 nil 이라면, ?? 뒤의 값을 반환해 달라는 뜻을 가지고 있습니다.
var someNumber: Int?
someNumber = 13
print(someNumber ?? "입력한 나이가 없습니다.")
// 13 출력. someNumber가 nil이라면 "입력한 나이가 없습니다."을 출력
'iOS > Swift' 카테고리의 다른 글
[Swift] 옵셔널(Optional) (0) | 2022.11.16 |
---|---|
[Swift] 조건문(if-else, switch) (0) | 2022.11.15 |
[Swift] 열거형(enum) (0) | 2022.11.13 |
[Swift] 논리 연산자 (2) | 2022.11.09 |
[Swift] 반복문(while, repeat-while) (0) | 2022.11.09 |
댓글