ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift Grammar] Guard구문에서의 non-Optional 선언
    iOS/Swift 2022. 5. 11. 14:50

    한 줄 요약

    (guard) case let을 사용해 선언해주면 된다.

    본문

    가끔 guard구문에서 여러가지 조건을 추가하기 위해서, non-Optional의 새로운 변수를 선언해야 하는 경우가 생긴다.

    guard구문 안에서 변수를 선언하게 되면, 해당 변수가 optional인지 아닌지에 대한 검사를 통해 Early exit이 이루어진다.

    즉, guard구문 안에서는 항상 Optional 변수가 선언되어야 하므로, non-Optional 변수에 대해서는 오류가 발생한다.

    non-Optional 변수에 대한 오류

    이 때 case let을 사용해 선언해주면 오류를 해결할 수 있다.

    예시를 통해서 자세히 알아보면 다음과 같다.

    예시

    SwiftUI에서, symbolName을 String으로 입력 받아, symbolName에 대응하는 systemName을 가진 Image를 생성하는 코드이다.

    extension SwiftUI.Image {
      init?(title: String) {
        guard let character = title.first else {
          return nil
        }
        let symbolName = "\(character.lowercased()).square"
        self.init(systemName: symbolName)
      }
    }

    이 생성자를 통해 여러가지 이미지를 생성해, preview로 확인 해보면 다음과 같다.

    마지막에 emoji를 넣었을 때에는 예외사항이 발생하는 것을 확인할 수 있다.

    이를 해결하기 위해서 해당 symbolName을 갖고 UIImage로 생성할 수 있는지 확인한다면, 위와 같은 버그가 발생하지 않을 것이다.
    왜냐하면, SwiftUI.Image(systemName: String)은 non-Optional을 return하는것을 보아 edge case에 대한 처리가 없는데 반해,
    UIImage(systemName: String)은 optional을 return하기 때문에, 해당 SF Symbol이 없다면 nil을 return하기 때문이다.

    해당 내용을 반영한 코드를 다시 작성 해보면 다음과 같이 할 수 있다.

    init?(title: String) {
      guard let character = title.first,
            let symbolName = "\(character.lowercased()).square",
            UIImage(systemName: symbolName) != nil else {
        return nil
      }
      self.init(systemName: symbolName)
    }

    하지만, 위에서 언급했다시피 guard구문 안에서 non-Optional 변수를 생성하면 오류가 발생하기 때문에 수정하면,

    guard let character = title.first,
            let symbolName = "\(character.lowercased()).square",
            UIImage(systemName: symbolName) != nil else {
        return nil
      }

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

    [Swift] Protocol에서 Method dispatch  (0) 2022.08.21
    [Swift] Method dispatch와 V-Table  (0) 2022.08.20
    [백준] 18258 큐 2 - Swift  (0) 2022.06.10
    [TIL] 참조와 캡쳐  (0) 2022.01.11
    [TIL] COW(Copy on Write)  (0) 2022.01.10

    댓글

Designed by Tistory.