일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Optional Chaining
- optional binding
- layout
- swiftUI
- 결혼식장계약후기
- hstack
- 자료구조
- Linked List
- SWIFT
- 좌표공간
- Optional
- 레이아웃
- nodejs
- Double Linked List
- vstack
- Hashing
- enum
- 시계방향
- 다짐
- 베뉴
- 각도
- Universal Hashing
- Test
- JavaScript
- 생각
- 더채플엣청담
- AlignmentGuide
- stack
- Today
- Total
klioop for iOS
[Swift] Optional 이해하기 본문
안녕하세요
스위프트 optional 타입에 대해서 정리해놓고 참고하려고 합니다.
가장 먼저 기억해야 할 것은 optional 은 enum 으로 정의되었다는 사실입니다!
enum Optional<T> {
case none
case some(T)
}
값이 초기화 되지 않거나 nil 일 경우 none 케이스 이고
어떤 값을 부여받으면 제너릭 T 타입의 associated value 를 가지는 some 케이스로 정의된 enum 이네요!
코드로 예시를 살펴보면 다음과 같습니다.
var optionalString: String?
var optionalString: String? = "hello"
var optionalString: String? = nil
var optionalString: Optional<String> = .none
var optionalString: Optional<String> = .some("hello")
var optionalString: Optional<String> = .none
optional 의 associated value 에 접근하는 방법은 크게 두 가지로
하나는 강제로, 다른 하나는 안전하게 접근하는 방법이 있습니다.
강제로 접근하는 방법을 보통 unwrap by force 라고 하는데요.
optional 변수 뒤에 ! 를 붙여서 접근하는 방법입니다.
이렇게 optional 의 associated 값에 접근하는 것을 optional 바인딩(binding) 이라고도 합니다.
var optionalString: String? = "Hello"
print(optionalString!)
// 위의 과정은 아래와 같음
switch optionalString: Optional<String> {
case .none // none 일 때 시스템이 종료된다.
case .some(let data):
print(data)
}
주의 해야 할 점은 강제로 접근했는데 associated value 가 존재하지 않으면 시스템이 충돌(crash)하여 종료됩니다.
print 문 아래의 switch 구문은
실제 optional 의 모습입니다.
안전하게 접근하는 방법은 여러가지가 있는데, 여기에서는 가장 보편적인 방법 하나를 살펴보겠습니다.
if let safelyUnwrapped = optionalString {
print(safelyUnwrapped)
} else {
// do something when safelyUnwrapped is nil
}
// 위의 과정은 아래와 같음
switch optionalString: Optional<String> {
case .none:
// do something
case .some(let data):
print(data)
}
여기까지 Optional 은 enum 이고
기본적인 binding 시 내부적으로 어떻게 동작하는지 살펴봤어요.
optional 이 enum 인 경우를 기억하고 머릿속으로 내부적인 과정을 그려보려고 노력하고 있습니다.
위 처럼 간단한 binding 의 경우 switch 로 바꾸어서 생각하는 것은 크게 어렵지는 않은데요.
optional 체이닝을 고려하면 조금 복잡해 질 순 있어요.
하지만 기본적인 원리는 똑같기 때문에 천천히 생각해보면 됩니다.
예시 하나를 볼까요
// Optional Chaining
let x: String? = "Hello"
let y = x?.foo()?.bar?.z
// 위의 과정은 아래와 같음
switch x: Optional<String> {
case .none: y = nil
case .some(let stringStruct):
switch stringStruct.foo() {
case .none: y = nil
case .some(let fooResult):
switch fooResult {
case .none: y = nil
case .some(let bar):
switch bar {
case .none: y = nil
case .some(let z):
y = z
}
사실 위 과정을 기억하고 싶어서 이 포스팅을 작성하고 있습니다 😅
과정 설명은 생략하겠습니다 :)
마치며..
optional 은 enum 이다!!
'swift' 카테고리의 다른 글
Static, Dynamic(table), 그리고 Message dispatch (0) | 2021.12.15 |
---|---|
ARC, weak, and weak self (0) | 2021.03.17 |
value type vs reference type (0) | 2021.03.17 |