옵셔널 Optional - 2

정승호·2022년 5월 30일
0

- Optional unwrapping

  • 옵셔널을 사용할 땐, 옵셔널 바인딩을 하는 것이 가장 바람직합니다.
    하지만, 옵셔널로 사용해야 하는 경우가 종종있습니다.
    이럴 때 옵셔널에 값이 있다고 가정하고 값에 바로 접근할 수 있도록 도와주는 키워드인 ! 를 붙여서 사용하면 됩니다.
  • 옵셔널 값은 랩에 쌓여 있어서, 사용하기 위해서는 unwrapping하는 과정이 필요합니다.

! 뜻 : 강제 추출 연산자 (Forecd Unwrapping Operator)


Optional Type

Non-optional Type

Wrapping

Unwrapping


  • !를 사용할 때, 아래와 같이 옵셔널의 값이 nil인 경우 런타임 에러 발생 -> IOS 앱 강제 종료 (크래시) 됩니다.


Optional Binding

  • 옵셔널을 안전하게 처리하는 방법입니다.
  • 옵셔널의 값을 가져오고 싶은 경우 사용합니다.

옵셔널 바인딩은 옵셔널의 값이 존재하는지를 검사, 존재하면 그 값을 다른 변수에 대입시켜줍니다.
if let 또는 if var 를 사용합니다.
옵셔널의 값을 벗겨서 값이 있다면 if문 안으로 들어가고
값이 nil이라면 그냥 통과하게 됩니다.

예시

optionalEmail에 값이 있으면
email이라는 변수 안에 값이 저장되고,
if문 내에서 그 값을 사용할 수 있습니다.

만약 optionalEmail이 nil이면,
if문이 실행되지 않고 지나쳐 집니다.

if var email = optionalEmail {
print(email)
}

하나의 if문에서 콤마(,)로 구분하여 여러 옵셔널을 바인딩할 수 있습니다.
이곳에 사용된 모든 옵셔널의 값이 존재해야 if문 안으로 진입합니다.

var optionalName: String? = "Donkey"
var optionalEmail: String? = "Donkey.gmail.com"

if let name = optionalName, email = optionalEmail {

}

옵셔널 바인딩할 때 콤마(,)를 사용하여 조건도 함께 지정할 수 있습니다.
콤마(,)이후의 조건절은 옵셔널 바인딩이 일어난 후 실행됩니다.
즉, 옵셔널이 벗겨진 값을 가지고 조건을 검사하게 됩니다.

var optionalAge: Int? = 22

if let age = optionalAge, age >= 20 {
}

윗코드와 동일 합니다.

var optionalAge: Int? = 22

if let age = optionalAge {
  if age >= 20 {
  }
}

옵셔널 IUO (Implicitly Unwrapped Optionals)

옵셔널 IUO란
강제 추출, 옵셔널 바인딩처럼 별도의 추출 과정을 거치지 않고도
옵셔널이 해제되는 방법 입니다.

  • 변수와 상수를 선언할 때 타입뒤에 ! 를 붙입니다.

  • 옵셔널 Unwrapping과 마찬가지로, 값이 없는데 접근을 시도하면 런타임 에러가 발생합니다.

참고자료
https://devxoul.gitbooks.io/ios-with-swift-in-40-hours/content/Chapter-2/optionals.html

https://babbab2.tistory.com/19

https://swallow0704.tistory.com/6

0개의 댓글