let myOptinal: String?

myOptional = "Hello"

let text: String = myOptional


이렇게 하면 에러가 뜬다.
왜냐하면 text는 string이고 myOptional은 optional string이기 때문이다.
이럴 땐 어떻게 해야할까?

가장 간단한 방법은 Force Unwrapping이다.
optianal! 이렇게 사용한다.

let myOptinal: String?

myOptional = "Hello"

let text: String = myOptional!


그런데 이 방식은 nil value가 있다면 사용할 수 없다.

let myOptinal: String?

myOptional = nil

let text: String = myOptional! // Error


정상적으로 build는 되지만 crash가 뜬다.
nil이 들어오는 경우도 많고, 그래서 더욱 안전한 방식을 찾아보자.

nil 값을 check하는 방법이다.
아래와 같이 사용한다.

if optional != nil {
	optional!
}


let myOptinal: String?

myOptional = nil

if myOptional != nil {
	let text: String = myOptional!
} else {
	print("myOptional was found to be nil.")
}


다음으로 Optional Binding을 소개하겠다.

if let safeOptional = optional {
	safeOptional
}


nil이 아니라면 if let을 통해 optional 값을 bind하기 위해 적고, unwrapped된 safe version optional값을 사용한다.

let myOptinal: String?

myOptional = "hello"

if let safeOptional = myOptional { // safeOptional은 string임
	let text: String = safeOptional
	let text2: String = safeOptional
	print(safeOptional) // hello 출력됨. 
} else {
	print("myOptional was found to be nil.")
}


그러나 여기서도 값이 nil이면 아예 스킵을 해버린다.
만약 nil일 때, default 값을 넣어주고 싶을 때 어떻게 해야할까?

바로 Nil Coalescing Operator를 사용한다.
두개의 ? 를 사용하여 나타낸다.

optional ?? defaultValue


let myOptinal: String?
myOptional = nil

let text: String = myOptional ?? "default value"

print(text) // default value 출력


이런식으로도 할 수 있다.
여기까지 소개한 4가지 방식으로 optional이 단지 simple value를 가질 경우 모두 커버가 가능하다.

그렇다면 optional struct나 optional class는 어떻게 해줄까?

struct MyOptional {
	var property = 123
	func method() {
		print("I am the struct's method")
	}
}

let myOptional: MyOptional?

myOptional = MyOptional()

print(myOptional.property) // error


여기서 error가 뜨는 이유는 property가 optional이 아니지만 struct가 optional이기 때문이다.
그냥 처음에 소개한 방식대로 Force Unwrapping를 사용하면 nil값이 들어오면 crash가 발생한다.
이러한 경우 안전하게 해결하기 위해 Optional Chaining을 사용한다.

optional?.property

optional?.method()


optional이 nil이 아니라면 property, method에 접근한다.

struct MyOptional {
	var property = 123
	func method() {
		print("I am the struct's method")
	}
}

let myOptional: MyOptional?

myOptional = nil

print(myOptional?.property) // 정상 작동


optional을 이용하여 코드를 작성할 때, 이 5가지 방법이면 모두 커버가 가능하다.

태그:

카테고리:

업데이트:

댓글남기기