[Swift] Optional (옵셔널)

LEEHAKJIN-VV·2022년 5월 3일
0

Study-Swift 5.6

목록 보기
4/22

참고 사이트:
Apple Developer
boostcourse


이번 글은 Swift의 Optional에 대해서 작성한다. Swift를 배우면서 Optional이 계속 언급되어 개념을 확실히 정리하고자 작성하게 됨.

Optional

  • Optional은 wrapped 값, nil, 값의 부재를 의미한다. -> Optional 변수에 nil 할당 가능
  • 장점
    • nil 가능성을 코드만으로 표현이 가능함으로 문서작성 시간 최소화.
    • Optional 인스턴스는 nil이 아니라는 약속이기 때문에 nil 체크를 하지 않고 사용이 가능하고 이는 효율적 코딩을 돕는다.
    • 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 이면 런타임 에러를 발생시킴으로 강제 추출 방법은 필수적인 경우가 아니면 사용하지 말자!

0개의 댓글