ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift - Optional Binding, Nil-coalescing Operator
    Programming/Swift 2020. 10. 5. 23:17

     

    오늘은 Optioanl을 추출하는 방법인 Optional Binding에 대해서 공부해 보겠습니다.

     


     

    지난 포스팅에서 강제 추출 연산자를 이용한 강제 추출에 대해서 같이 공부했습니다.

    강제 추출은 만약 nil을 추출하려고 하면 FatalErrorr가 발생했었죠??

    그리고 이를 안전하게 쓰기 위해서는 

     

     

     

     

    이렇게 If문으로 nil이 아닌지를 판단한 후에 강제 추출을 사용해야 합니다.

    하지만 매번 이렇게 사용하기에는 문제가 많습니다.

    그래서 옵셔널 값을 추출할 땐 OptionalBinding을 사용합니다.

     


     

    Optional Binding

     

    Optional Binding은 if, while, guard문에서 사용됩니다.

    guard문에서의 사용법을 보겠습니다.

     

     

     

     

    여기서 let name: Type = OptionalExpression 부분을 Binding이라고 합니다.

    새로운 변수나 상수의 이름을 쓰고 추출하고 싶은 옵셔널 표현식을 할당합니다.

     

    만약 상수나 변수에 값이 할당된다면 바인딩에 성공했다고 표현하고 else문 이후의 코드를 실행합니다.

    할당에 실패하면 바인딩에 실패했다고 표현하며 else문을 실행합니다.

    그럼 성공과 실패 여부는 어떻게 결정될까요?

    상수나 변수에 nil이 할당된다면 실패한 것입니다.

    바로 예를 보겠습니다.

     

     

     

     

    여기서 주목해야 할 부분은 optionalNum의 Type은 Int?이고 num의 Type은 Int 이란 점입니다.

    optionalNum은 num에  바인딩되었고 이제 num 상수는 guard문 이후에 사용할 수 있습니다. 

    num 상수는 else문 안에서는 사용할 수 없습니다.

    이제 guard 사용의 주의할 점 몇 가지를 보겠습니다.

     

     

    guard문에서 바인딩한 상수나 변수는 else문에서는 사용이 불가능 합니다.

    바인딩을 할 때의 변수나 상수의 이름은 뒤에 OptionalExpression의 이름과 동일한 이름을 사용할 수 있습니다.

    그리고 Type을 지정해주지 않으면 TypeInference를 통해 옵셔널을 추출한 Type으로 자동으로 지정해줍니다.

     

     

    옵셔널 바인딩은 여러 개를 ,(comma)로 동시에 바인딩이 가능하고

    조건을 추가할 수 도 있습니다.

    위에 코드는 str, char이 모두 바인딩이 성공하고 str.count의 개수가 3개 이상일 때만 바인딩에 성공합니다.

    하나라도 만족하지 못하면 else문이 실행됩니다.

     

    계속해서 else문에서 fatalError를 사용하는 것은 playground에서 예제를 작성하고 있기 때문입니다.

    else문에서는 해당스코프를 종료시키거나 제어를 전달하거나 에러를 전달해야 하는데 글로벌 스코프에서 작성하고 있으니 fatalError를 발생시키고 있는 것입니다.

     


     

    if문과 guard문의 차이

     

    if문을 사용하여 바인딩을 하면 어떤 차이가 있을까요??

     

    이렇게 작성할 수 있겠죠? 

    눈에 띄는 차이는 코드의 들여 쓰기가 생겼습니다.

    들여 쓰기는 많을수록 코드가 가독성이 떨어지기 때문에 적당히 사용해야 합니다.

    그리고 num을 사용할 수 있는 범위가 guard문은 else이후에 사용할 수 있는 반면 if문은 if문 안에서만 사용이 가능합니다.

    만약 바인딩한 num을 계속 사용을 해야 한다면 모든 코드가 if문 안에 포함되어야 하겠죠?

    이러한 점 때문에 아주 간단하거나 바인딩한 값을 한 번만 사용하는 경우가 아니면 guard문으로 바인딩하는 것이 좋습니다.

     

    물론 guard문의 특성인 ealry exit도 고려해야합니다.

    바인딩에 실패해도 아래 코드 중 일부가 실행되어야 하는데  guard로 바인딩에 실패하면 해당 스코프를 빠르게 끝내버릴 수도 있기 때문입니다.

     


     

    Nil-coalescing Operator

     

    Nil-coalescing Operator(nil 병합 연산자)는 이항 연산자입니다.

     

    OptionalExpression의 Type과 Expression의 Type은 ?를 제외하고 같아야 합니다.

    nil-coalescing Operator는 OptionalExpression이 추출에 성공하면 OptionalExpression를 리턴하고 실패하면 Expression을 리턴합니다.

    말로 하면 어려우니 예제를 보겠습니다!

     

    nameStr을 옵셔널 String으로 선언하고 if문에서 바인딩하고 있습니다. 바인딩에 성공하면 nameStr을 출력하고

    실패하면 "I don't know who I am"을 출력하는 코드입니다.

    이 코드를 nil 병합 연산자를 사용하면 

     

    한 줄로 간단하게 작성이 가능합니다.

    이 코드는 nameStr에 값이 저장되어 있다면 nameStr을 출력하고 값이 없다면 "I don't know who I am"를 출력해줍니다.

    그럼 nameStr에 nil을 저장해보겠습니다.

     

    그러면 ?? 뒤에 있는 "I don't know who I am"이 출력되는 것을 확인할 수 있습니다.

     

     


     

    참고자료

     

    https://kxcoding.com

     

    여러분의 새로운 도전을 응원합니다 | KxCoding

    Mastering SwiftUI 더 적은 코드로, 더 멋진 UI 만들기

    kxcoding.com

     

     

    https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

     

    The Basics — The Swift Programming Language (Swift 5.6)

    The Basics Swift is a new programming language for iOS, macOS, watchOS, and tvOS app development. Nonetheless, many parts of Swift will be familiar from your experience of developing in C and Objective-C. Swift provides its own versions of all fundamental

    docs.swift.org

     

     

     

    728x90

    'Programming > Swift' 카테고리의 다른 글

    Swift - Function Parameter  (0) 2020.10.07
    Swift - Function Basic  (0) 2020.10.06
    Swift - Optional, Forced-Unwrapping  (0) 2020.10.01
    Swift - Control Transfer Statements  (0) 2020.10.01
    Swift - Loop Statements  (0) 2020.09.30
Designed by Tistory.