옵셔널과 옵셔널 추출의 방법 5가지

Lena·2022년 1월 13일
0

Swift

목록 보기
7/8
post-thumbnail

옵셔널 사용이 쉽지 않아 다시 정리를 해보려 한다.

Optional

  • 안정성을 문법으로 담보한다.
  • 값이 있을 수도, 없을 수도 있음을 나타내는 것이다.
    : 변수 또는 상수의 값이 nil일 수도 있다
  • 옵셔널과 옵셔널이 아닌 값은 다른 타입으로 인식하므로 컴파일 시 오류를 바로 걸러낼 수 있다
  • 옵셔널로 정의한let myOptional: String? 이 값은 String과는 완전히 다른 데이터 타입이다.
    그러므로 let text: String = myOptional 이라고 text에 넣을 수 없다.
  • 이러한 옵셔널을 옵셔널을 아닌 값으로 추출하는 다섯 가지 방법에 대해 천천히 살펴보자.

1. Force Unwrapping

  • 옵셔널 값 뒤에 ! 붙여준다.
  let myOptional: String?
  myOptional = "Lena"
  let text: String = myOptional!
  • 강제 언래핑되어 옵셔널 형이 아닌 String 형이 되었다.
  • 하지만 강제 언래핑은 가장 위험한 방법이다!
    진짜 nil값이 들어있다면? : 런타임 오류가 나기 때문.
  • if 조건문을 이용해 좀 더 안전하게 처리해보자. check for nil value로!

2. Check for nil value

  • 옵셔널 값이 nil이 아니면 강제 언랩핑을 해준다!
    • 아래 예시코드에서 myOptional이 nil값을 가지므로 else에 있는 print문을 출력한다.
let myOptional: String?

myOptional = nil


if myOptional != nil {
    let text: String = myOptional!
} else {
    print("myOptional was found to be nil")
}
  • force unwrapping보다는 안전하지만 여전히 런타임 오류 발생 가능성을 내포하고 있으므로 지양해야 한다!

3. Optional Binding

  • 옵셔널 바인딩
    : if 구문 내에서 조건식 대신 옵셔널 값을 일반 변수나 상수에 할당하는 구문을 사용하는 방식
  • 조건문 내에서 일반 상수에 옵셔널 값을 대입하는 방식으로 이루어진다.
    (반드시 조건문에서 사용해야만 한다!)
  • 상수에 옵셔널 값을 대입한 결과는 boolean 타입으로 반환된다.
  • 조건문 사용하는 것은 위와 비슷하지만, 강제 언래핑 연산자를 사용하지 않을 수 있다!

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

:myOptional 에 값이 있는 경우 값을 출력, nil인 경우 else 구문 출력

4. Nil Coalescing Operator

  • nil이면 옵셔널 값으로, nil이 아니면 그 값을 출력한다.

let myOptional: String?

myOptional = nil

let text: String = myOptional ?? "나는 default value야"

print(text)

: nil 이면 "나는 dafault value야" 출력

5. Optional Chaining

  • 옵셔널 체이닝은 옵셔널에 속해 있는 nil일지도 모르는 property, method, 서브스크립션 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정이다.
    • 옵셔널에 값이 있다면
      : property, method, 서브스크립트 등을 호출할 수 있고
    • 옵셔널이 nil이라면 : property, method, 서브스크립트 등이 nil을 반환한다.
  • 중첩된 옵셔널 중 하나라도 값이 존재하지 않으면 nil을 반환한다.

옵셔널 체이닝의 사용

struct MyOptional {
    var property = 123
    func method() {
        print("나는 struct의 method야")
    }
}


let myOptional: MyOptional?

myOptional = MyOptional()

myOptional?.method()


  • 참고자료
    : Udemy - Angela Yu 강의, 꼼꼼한 재은씨의 Swift 문법편

0개의 댓글