Optional은 Enum이다. 이게 무슨 말일까??
enum Optional<T> { // <T>는 Optional 모든 타입에서 가능하다는 뜻 (String?, Int? ... )
case None
case Some(T)
}
Optional은 값이 set되지 않은 None case와 값이 set된 Some case 두가지가 존재한다는 것을 말한다.
Optional에서의 ? 와 ! 에 대해서 더 알아보자.
let x: String? = nil
위와 같은 코드는 아래 코드처럼 해석될 수 있다.
let x = Optional<String>.None
값을 지정해주는 경우에는 어떨까??
let x: String? = "hello"
다시 위와 같은 코드는 아래 코드처럼 연관값(associated value)를 갖게되는것으로 해석될 수 있다.
let x = Optional<String>.Some("hello")
! 강제 추출 옵셔널의 방식에 대해서도 알아보자.
var y = x!
옵셔널에서 값을 강제로 추출하는 것은 switch로 이뤄지고 만약 값이 없는 nil이 발견되면 앱은 충돌을 일으키고 죽게된다.
switch x {
case Some(let value): y = value
case None: // Exception 발생 -> App Crash
}
옵셔널 바인딩 형태인 if는 어떤식으로 될까?
let x: String? = ...
if let y = x {
// do something
}
switch x 구문에서 Some case에서 y값을 가져와서 무언가 로직을 수행하고 없다면 그냥 그 자리에서 로직을 종료시키게 된다.
switch x {
case .Some(let y):
// do something
case .None:
break
}
var display: UILabel?
if let label = display {
if let text = label.text {
let x = text.hashValue
}
}
위와 같은 코드는 if let 구문을 통한 옵셔널 바인딩으로 계속해서 값의 유무를 확인하고 있다.
옵셔널 체이닝으로 위 코드를 간결하게 나타낼 수 있다.
if let x = display?.text?.hashValue { ... }
옵셔널을 사용하려 할 때 ? 를 사용하면 일단 추출을 시도하고 추출할 수 있다면 그 값을 가지고 다음으로 넘어가고 값이 없다면 그냥 그 자리에서 nil을 return하게 된다.
위의 x값의 타입은 Int?를 가지게 된다. 추출이 하나라도 실패하면 nil이 return되기 때문에 nil을 가질수도 있기 때문에 Optional Int가 된다.
let s: String? = ...
if s != nil {
display.text = s
} else {
display.text = " "
}
화면에 값을 넣을 때 nil을 넣으면 사이징이 망가지는 경우가 있기 때문에 빈 문자열을 넣어서 그런 경우를 막고 싶을 때 위와 같이 nil일 경우에 대한 대체값을 넣어주는 경우가 있다.
위와 같은 코드를 default 연산자("??") 를 통해 더욱 더 간결하게 나타낼 수 있다.
display.text = s ?? " "
s가 nil이 아니라면 값을 추출해서 사용하고 nil이라면 빈공간 문자열을 사용하겠다는 뜻이 된다. 위와 동일한 기능을 수행한다.
출처 : Stanford iOS 강의를 보며 정리.