본문 바로가기

앱 개발/IOS

[IOS 프로그래밍을 위한 스위프트 기초] 1단원 12. 옵셔널 추출

12. 옵셔널 추출

옵셔널 추출 방법

Optional Binding

옵셔널 값을 꺼내오는 방법 중 하나로 nil 체크와 더불어 안전한 값을 추출한다.

옵셔널 바인딩은 예를 들어, 정수가 상자 안에 있을 때, 상자에 값을 물어보는 방식이다.

func printName(_ name: String) {
	print(name)
}

var myName: String? = nil

printName(myName) // 전달하는 값의 타입이 다르기 때문에 컴파일 오류가 발생한다.

위의 코드와 같은 문제를 해결하기 위해 if-let 구조를 활용한다.

func printName(_ name: String) {
	print(name)
}

var myName: String! = nil

if let name: String = myName {
	printName(name)
} else {
	print("myName == nil")
}

name 상수는 if-let 구문 내에서만 사용할 수 있다.

printName(name)

위 코드는 상수 사용범위를 벗어났기 때문에 컴파일 오류가 발생한다.

또한 한 번에 하나의 상수만 바인딩할 수 있는 것이 아닌, 한 번에 여러개의 상수를 바인딩할 수 있다.

var myName: String? = "fuyukawa"
var yourName: String? = nil

if let name = myName, let friend = yourName {
	print("\(name) and \(friend)")
}
// yourName이 nil이기 때문에 실행되지 않는다.

yourName = "hana"

if let name = myName, let friend = yourName {
	print("\(name) and \(friend)")
}
// fuyukawa and hana

Force Unwrapping - 옵셔널 값을 강제로 추출

보호막을 강제로 깨부시고 가져온다고 생각하면 쉽다

func printName(_ name: String) {
	print(name)
}

var myName: String? = "fuyukawa"

printName(myName!) // fuyukawa

위의 예시처럼 파라미터 뒤에 !(느낌표)를 붙이게 되면 값을 강제로 추출한다.

myName = nil

print(myName!)

다만, 이 경우 nil을 할당하게 되면 값이 없기 때문에 런타임 오류가 발생한다.

var yourName: String! = nil

printName(yourName)

암시적 추출 경우 처음에 선언할 때부터 파라미터 뒤에 !(느낌표)가 붙어 있다고 가정하기 때문에 printName에서 느낌표를 안 붙여도 런타임 오류가 발생한다.

그렇기에 강제추출법은 선호되지 않는다.

 

 

 

 

©️NAVER Boostcourse. All Rights Reserved.