티스토리 뷰

Swift

[swift] Optional

진태우 2019. 3. 29. 15:52

 

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

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함