Optional

E_H·2021년 3월 20일
0

Swift

목록 보기
2/11

개요

About Swift

Swift문서에서 볼 수 있듯이 Swift는 안전한 코딩을 위한 언어라고 한다.
그렇다면 안정성에 기본이 되는 Optional에 대해 한 번 알아보자

Optional은 무엇이고 어떻게 쓰는 것 일까?

Optional에 대해 알아보기 위해 공식문서를 한 번 살펴보자.

let shortForm: Int? = Int("42")
let longForm: Optional<Int> = Int("42")

var number: Int?

옵셔널은 위 코드처럼 선언할 수 있으나 shortForm처럼 단축된 양식을 쓰는게 가독성면에서 좋다고 한다.

Optional 타입은 두가지이다. 값이 있거나 없거나(nil)

let number: Int? = Optional.some(42)
let noNumber: Int? = Optional.none
print(noNumber == nil)
// Prints "true"

그렇다면 Optional의 값이 있을 경우 어떻게 가져올까?

문서에는 네 가지 방법이 있다고 한다.
아래 코드를 이용하여 옵셔널 값들을 꺼내보자

let imagePaths = ["star": "/glyphs/star.png",
                  "portrait": "/images/content/portrait.jpg",
                  "spacer": "/images/shared/spacer.gif"]

Dictionary의 키를 이용하여 값을 꺼내올 때는 optional Value가 반환되기 때문에 imagePaths["star]은 String? 타입이다.

1) Optional Binding

Optional Binding은 if let, guard let, and switch처럼조건문을 이용하여 값을 꺼낼 수 있다!

if let starPath = imagePaths["star"] {
    print("The star image is at '\(starPath)'")
} else {
    print("Couldn't find the star image")
}
// Prints "The star image is at '/glyphs/star.png'"

2) Optional Chaining

래핑(?)된 인스턴스의 메소드와 프로퍼티들에 안전하게 접근하려면 옵셔널 연산자 postfix를 사용하자. 아래 코드는 String? 인스턴스에hasSuffix를 통해 옵셔널 체이닝을 사용하는 예제이다.

if imagePaths["star"]?.hasSuffix(".png") == true {
    print("The star image is in PNG format")
}
// Prints "The star image is in PNG format"

3) Using the Nil-Coalescing Operator

nil-calenescing 연산자(??)를 사용하여 옵셔널의 기본값이 nil인 경우 기본값을 제공하여 나타낸다. 이 예시에서 기본 값은 String타입의 이미지 경로를 나타냈다.

let defaultImagePath = "/images/default.png"
let heartPath = imagePaths["heart"] ?? defaultImagePath
print(heartPath)
// Prints "/images/default.png"

그리고 ?? 연산자는 여러번 적어 나타낼 수 도 있다.

let shapePath = imagePaths["cir"] ?? imagePaths["squ"] ?? defaultImagePath
print(shapePath)
// Prints "/images/default.png"

4) Unconditional Unwrapping

만약 Optional에 값이 들어있다고 확신할 수 있는경우

let number = Int("42")!
print(number)
// Prints "42"

!를 사용하여 값을 강제로 꺼낼 수 있다.

하지만 Optional의 값이 nil일 때 강제언래핑(!)을 할 경우 런타임 에러가 생기기 때문에 되도록이면 위 3가지 방법을 이용하여 Optional의 값을 꺼내는 것이 좋다.

0개의 댓글