dev._.note

[Swift] Optional(옵셔널) 본문

Dev/SWIFT

[Swift] Optional(옵셔널)

Laena 2023. 11. 14. 22:59

Optional

  • Optional은 wrapped 값, nil, 값의 부재를 의미한다. -> Optional 변수에 nil 할당 가능
  • 장점
    1. nil 가능성을 코드만으로 표현이 가능함으로 문서작성 시간 최소화.
    2. Optional 인스턴스는 nil이 아니라는 약속이기 때문에 nil 체크를 하지 않고 사용이 가능하고 이는 효율적 코딩을 도움.
    3. nil로 인한 예외 상황을 최소화 하기 때문에 보다 안전한 코딩이 가능.

Declartion

@frozen enum Optional<Wrapped>

 


Optional 선언

  • 선언에는 짧은 선언 방법과 긴 선언 방법이 있다. 의미상 동일하나, 읽고 쓰기 쉬운 짧은 선언 방법을 사용을 더 많이 한다.
let shortForm: Int? = Int("42")
let longFrom: Optional<Int> = Int("42")
  • Optional 타입은 2가지 경우의 열거형으로 이루어져 있다.
  • Optional.none은 nil과 같고, .some(Wrapped)은 wrapped 값을 저장하고 있다.
let number: Int? = Optional.some(42)
let noNumber: Int? = Optional.none

print(number)
// Prints "Optional(42)"

print(noNumber)
// Prints "nill"

print(number)의 출력 결과를 보면 Integer인(42)가 Optional 인스턴스로 Wrapping된 것을 확인할 수 있다.


여기서 Wrapping의 개념을 알아보고 Optional을 설명한다.

Wrapping

  • wrapping이란 무엇을 의미하냐 인스턴스를 wrap(감싸다)는 형태를 말한다. Optional 타입은 모두 wrap되어 있다.
  • Optional 타입으로 선언된 변수가 가지고 있는 값은 모두 wrap되어 있기 때문에 nil인지 특정한 value인지 컴파일러는 확인할 수 없다. 그러므로 안전을 위해 Optional 인스턴스로 반환 되는것을 확인할 수 있다.

다음 예는 dictionary를 이용하여 이미지의 이름과 경로를 사용한 예시다.

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

위 예시를 보면 dictionary의 subscript로 접근시 return value 값 또한 Optional 인스턴스임을 확인할 수 있다.


그러면 Optional 인스턴스에 있는 vlaue를 다른 코드에서 사용하기 위해선 unwrap을 해야한다. swift는 여러가지 안전한 방법을 제공한다.

그 중 2가지 방법은 Optional Binding 방식과 Unconditional Unwrapping 즉 Optional 강제 추출이다.

🦭 Optional Binding

  • nill을 체크하고 값을 가져오는 안전한 방법이다.
  • if-let 방식과 gauard let 방식, switch로 추출할 수 있다.

if let 방식

  • 만약 startPath가 값이 존재하지 않는 경우, 즉(nil)이라도 runtime error가 아닌 else문을 통해 예외 처리를 할 수 있으므로 안전하다.
    if let startPath = imagePaths["star"]{
       print("The star image is at '\(startPath)'")
    } else {
       print("Couldn't find the star image")
    }
    // Prints "The star image is at '/glyphs/star.png'"

❌ Unconditional Unwrapping

  • Optional 인스턴스의 value가 nil이 아닌 특정한 값이 라고 확신할 때
    ("!")연산자를 이용하여 강제적으로 값을 upwrap 할 수 있다.
  • 아래 예시에서 Int의 생성자는 강제적으로 unwrapped된다.
    let number = Int("42")!
    print(number)
    // Prints "42"
    이 방법은 만약 값이 없을때 즉 nil 이면 런타임 에러를 발생시킴으로 강제 추출 방법은 필수적인 경우가 아니면 사용하지 말자!

'Dev > SWIFT' 카테고리의 다른 글

[Swift] 기본자료형 및 숫자 타입  (0) 2023.11.16
[Swift] Currying(커링)  (0) 2023.11.15
[Swift] IBAction과 IBOutlet  (1) 2023.11.13
[Swift] Dictionary (사전형)  (0) 2023.11.12
[Swift] Set (집합)  (0) 2023.11.10