Swift, Optional

iDO·2021년 9월 19일
0

Swift

목록 보기
2/5
post-thumbnail

🍁What is Optional?

: 옵셔널은 nil값이 존재할 수 있는 타입들을 지칭합니다.

//ex) Optional<String>, Optional<Int> ...

예를 보면 옵셔널 타입이 뭔지 이해하실 수 있습니다.

let strNumber = "123"
let intCasting = Int(strNumber)
print(type(of: intCasting) // -> Optional<Int>

위 같이 String 값을 Int 타입으로 케스팅 한 다음, 타입을 출력하면 Int가 아니라 "Optional" 가 나옵니다. 🤔

let strNomal = "abc"

let intCasting = Int(strNomal)
print(intCasting) // -> nil

만약 숫자형 문자가 아닌 영어나 다른 언어를 int로 케스팅하는 경우 nil 이 출력됩니다.

즉, 옵셔널타입이란 값이 존재하지 않을 수도 있는 경우의 타입을 말합니다.

nil값이 필요한 옵셔널 타입의 프로퍼티(변수, 상수)를 생성하고 싶을 시 타입뒤에 ? 를 추가해주시면 됩니다.

ex) var str: String?,var num: Int? ...

옵셔널타입은 항시 nil 값에 대해서 처리를 해줘야 합니다. 방법으로는 "Forced Unwrapping" 과 "Optional Binding" 이 존재합니다.

🍁Forced Unwrapping

! 를 통해서 옵셔널 값을 처리할 수 있습니다.

et strNumber = "123"

let intCasting = Int(strNumber)!
print(type(of: intCasting) // -> Int

! 를 추가했더니 전과 다르게 Int 타입을 출렸했습니다.

❗️하지만 Forced Unwrapping 런타임 오류에 취약합니다. 그래서 nil값이 존재하지 않는다고 확신한 경우에만 사용해야 합니다.

let strNomal = "abc"

let intCasting = Int(strNomal)
print(intCasting!) // 언래핑시 Error --> Fatal error: Unexpectedly found nil while unwrapping an Optioanl value. 

🍁 Optional Binding

옵셔널 바인딩은 조건문(if, while, guard)을 통하여 nil 값을 처리하는 방식입니다.

ex) if로

let strNomal = "abc"

let intCasting = Int(strNomal)

if let binding = intCasting {
    print("\(binding)")
} else {
    print("binding is nil") // nil 처리
}

// -> binding is nil

ex) guard문(my love)

let strNomal = "abc"

let intCasting = Int(strNomal)

guard let binding = intCasting else {
    
    return
}

print(binding) // -> 아무값 안나옴. nil 에 대해 출력을 원하면 else 블록안에다 추가하면 되요!

🍁내가 guard문 을 사랑하는 이유🤔🤔

guard문이 if문과 다른점

  • ~이름이 멋있다.~
  • else를 먼저 catch 함으로 빠른 종료가 가능하다. -> else 블록을 실행 후 메소드에서 벗어납니다!
  • 메소드 내에서만 사용가능하다.
  • 옵셔널 바인딩한 상수의 Scope가 다르다❗️

if 문의 경우

func optionalBindingIf() {
    if let binding = intCasting {
        print("\(binding)")
    } else {
        print("binding is nil") // nil 처리
    }
    let message = binding // Error-> Cannot fint 'binding' in scope : if문 밖에서는 바인딩한 상수에 접근 할 수 없음! ☹️
}

guard문의 경우

func optionalBindingGuard() {
    guard let binding = intCasting else {
        return
    }
    let message = binding // 바인딩한 값을 guard 구문 밖에서 사용가능합니다! 👍
}

🧐

profile
이곳은 저를 위한 iOS 설명서입니다.

0개의 댓글