[Swift] Optional

MinTa·2022년 3월 1일
0
post-thumbnail

Optional is Enum.

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
}

Optional can be Chained.

Optional Chaining

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가 된다.

Optional defaulting operator "??"

let s: String? = ...
if s != nil {
	display.text = s
} else {
	display.text = " "
}

화면에 값을 넣을 때 nil을 넣으면 사이징이 망가지는 경우가 있기 때문에 빈 문자열을 넣어서 그런 경우를 막고 싶을 때 위와 같이 nil일 경우에 대한 대체값을 넣어주는 경우가 있다.

위와 같은 코드를 default 연산자("??") 를 통해 더욱 더 간결하게 나타낼 수 있다.

display.text = s ?? " "

s가 nil이 아니라면 값을 추출해서 사용하고 nil이라면 빈공간 문자열을 사용하겠다는 뜻이 된다. 위와 동일한 기능을 수행한다.


출처 : Stanford iOS 강의를 보며 정리.

profile
지(치지않고)꾸(준히)열(심히)

0개의 댓글