티스토리 뷰
Optional은 아래와 같이 enum으로 구현되어 있습니다.
enum Optional<T> {
case none
case some(<T>)
}
optional의 타입은 generic이라 Int, String 등 어떤 타입도 들어갈 수 있습니다.
optional에는 두가지 경우가 있는데, none은 아직 설정되지 않은 경우이고 some은 그 타입의 값을 가지고 있다는 의미입니다.
optional은 enum이지만 enum으로 사용하지 않는 이유는 optional을 사용할 때마다 switch문을 사용하여 값을 얻어야 합니다. 그러면 코드도 길어지고 복잡해 질 것입니다. 그래서 ?, !, ??, if 등으로 쉽게 표기하게 만들고 내부적으로는 enum으로 작성된 optional 코드가 실행되는 것입니다.
var hello: String? // var hello: Optional = .none
var hello: String? = "hello" // var hello: Optional = some("hello")
var hello: String? = nil // var hello: Optional = .none
optional은 항상 nil로 시작합니다.
아래는 optional을 unwrapping하는 방법을 보여주는 예제입니다.
enum Optional<T> {
case none
case some(<T>)
}
let hello: String? = "hello"
print(hello!)
switch hello {
case .none: // error 발생
case .some(let data): print(data)
}
enum Optional<T> {
case none
case some(<T>)
}
if let greeting = hello {
print(greeting)
} else {
// do someting...
}
switch hello {
case .none: // do something...
case .some(let data): print(data)
}
- nil coalescing operator(nil 병합 연상자)
enum Optional<T> {
case none
case some(<T>)
}
let hello: String? = "hello"
let greeting = hello ?? "bye"
switch hello {
case .none: greeting = "bye"
case .some(let data): greeting = data
}
nil 병합 연산자는 ??로 표현되고 optional의 값이 있으면 some의 경우인 ??의 왼쪽 값을 사용하고, 값이 없으면 none의 경우인 ??의 오른쪽 값을 사용하는 것이다.
- Optional Chaining (옵셔널 체인)
아래는 옵셔널 체인을 보여주는 예제입니다.
enum Optional<T> {
case none
case some(<T>)
}
let x: String? = ...
let y = x?.foo()?.bar?.z
switch x {
case .none: y = nil
case .some(let data1):
switch data1.foo() {
case .none: y = nil
case .some(let data2):
switch data2.bar {
case .none: y = nil
case .some(let data3): y = data3.z
}
}
}
옵셔널 체인이라는 것은 x의 값을 얻고 있으면 다음 값인 x.foo()의 값을 얻고 있으면 또 다음 값을 얻어서 최종적인 값을 얻는 방식입니다. 중간에 하나라도 값이 없을 경우 nil이 반환되게 됩니다.
위 예제에서 중간에 하나라도 값이 없으면 y=nil이 되고 모두 값이 있으면 y=x.foo().bar.z이 됩니다.
html 코드 붙여 넣는거 너무 힘들다....
좀 더 편하게 보시려면 아래 링크로 보세요!!
https://www.notion.so/taewoojin/swift-Optional-30696c8b97f0419d963fee1a73a28212
'Swift' 카테고리의 다른 글
[swift] AVFoundation를 이용한 Video Record 만들어보기 (2) | 2020.03.25 |
---|---|
[swift] escaping closure (0) | 2019.04.14 |
[swift] Enum (0) | 2019.03.29 |
정수값에 구분자를 넣어보자!! (0) | 2018.08.21 |
내장된 notificationName 사용하여 notification 등록해보기 (0) | 2018.08.21 |
- Total
- Today
- Yesterday
- CollectionView
- m3u8
- AVKit
- Swift
- RECORDING
- permission error
- Design Pattern
- NIB
- BaseViewController
- AVFoundation
- testing
- Realm
- ssh
- TDD
- UIBarButtonItem
- Coordinator
- database
- http live streaming
- Cleancode
- IOS
- Video
- xib
- pagingView
- AssociatedObject
- customAlertView
- UIControl
- carousel
- UIButton
- HLS
- Closure
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |