-
[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