옵셔널

이하연·2021년 9월 16일
0

[Swift] 스위프트

목록 보기
18/27

옵셔널에 대한 7가지 개념

  1. force unwrapping
  2. optional binding - if
  3. optional binding - guard
  4. nil coalescing
  5. optional chaining
  6. implicitly unwrapped optional
  7. optional pattern

옵셔널 바인딩

옵셔널 바인딩은, "선택적 결합"으로 "옵셔널을 열어봤는데 값이 들어있으면 이 변수에 할당한다"로 해석

옵셔널을 깠는데 nil일 경우 guard let은 else이 꼭 필요하고 else로 감, if let은 else가 꼭 필요없고 else가 있으면 else로 감

옵셔널을 안전하게 처리하는 방법입니다. → 옵셔널 값은 랩에 쌓여있어 사용시 언래핑 과정이 필요

  • if문, while문, guard문에서 사용

if-else 구문

var pocketMoney: Int? = 300 // 옵셔널 변수

if let unwrappedPocketMoney = pocketMoney { // (A)
	pocketMoney = unwrappedPocketMoney + 100 // (B) 
} else {
	print("pocketMoney가 nil이면 이 문구가 출력된다.") // (C)
	pocketMoney = 100
}
  • (A)의 pocketMoney(옵셔널 변수)

    • nil일 경우

      else문안의 (C)코드가 실행

    • nil이 아닐 경우

      옵셔널 열어봤는데 nil이 아니므로 unwrappedPocketMoney 변수에 할당된다.
      그 후, (B) 코드가 실행된다.

      이때, unwrappedPocketMoney 변수는 If문 내부의 스코프에서만 사용이 가능
      if문밖의 스코프에선 unwrappedPocketMoney 존재하지 않는다.

  • 하나의 if문에 여러개의 옵셔널 바인딩을 할 수 있다.

    • 쉼표는 AND(&&) 연산자와 같이 작용
    • 하나의 옵셔널 바인딩이 nil일 경우 if문 내부코드는 실행안됨
  • if는 else가 반드시 필요하진 않음.

guard 구문

func downloadImage (from url: URL?) {
	guard let url = url else {
    	print("url is nil. url not found!")
        return
    }
    print("url is not wrapped with optional here: \(url)"
    beginDownload(url: url)
}
  • guard-else는 한쌍이다.
  • else문 안에서는 항상 함수를 종료시켜야한다.
  • 옵셔널 바인딩을 통해 초기화된 옵셔널의 값은 옵셔널이 아닌 일반 타입의 값으로 해당 함수의 스코프 내 어디에서든 사용이 가능해진다.
    • 이는 함수 내부의 옵셔널에 값이 들어있지 않을때는 함수를 일찍 종료하고 나머지 코드를 실행하지 않게 만들어준다.
  • 역시 한번에 여러개를 처리 가능
  • 다른 조건문과 함께 섞어서 사용 가능
  • 옵셔널 바인딩에만 한정된게 아니라 일반적인 조건문과도 사용 가능

0개의 댓글