프로그래밍iOS 개발자

Optional을 사용할 때 Swift의 패턴 매칭의 특징에 대해 설명하세요: case let, if case, guard case를 사용하여 Optionals를 어떻게 올바르게 검사할 수 있는지, 사용 시 어떤 주의사항을 고려해야 하는지 알려주세요.

Hintsage AI 어시스턴트로 면접 통과

답변

Swift의 Optional에 대한 패턴 매칭은 nil일 수 있는 값들을 우아하고 안전하게 처리할 수 있도록 합니다. if let 및 guard let을 통한 직접 확인 외에도 case let, if case, guard case와 같은 다양한 방법이 제공되며, 이는 값을 추출하는 것뿐만 아니라 추가 조건을 적용해야 할 때 특히 유용합니다.

표준 추출 예제:

if let value = optionalValue { print("Value is \(value)") }

조건이 있는 패턴 매칭 예제:

if case let .some(value) = optionalValue, value > 10 { print("Value is greater than 10: \(value)") }

유사하게 guard를 사용하는 예:

guard case let .some(value) = optionalValue else { return }

세부 사항:

  • if case/guard case를 사용할 때는 서로 다른 optional 값에 대해 개별 case를 결합할 수 없습니다(예: 하나의 if case에서 여러 optional 변수를 사용할 수 있는 것은 오직 튜플입니다).
  • 이러한 접근 방식은 여러 optional의 조건이나 값 비교를 위한 패턴 매칭에 적합합니다.
  • case let을 사용하면 대수적 타입과 optionals에 대한 switch에서 편리합니다.

트릭 질문

Swift에서 optional과 함께 사용할 때 if let value = x as? Int if case let value? = x 의 차이점은 무엇인가요?

답변:

  • if let value = x as? Int는 타입 캐스팅이 포함된 optional 바인딩을 위해 사용됩니다.
  • if case let value? = x는 optional에서 non-nil 값을 추출하는 패턴 매칭입니다.

예제:

let x: Int? = 42 if case let value? = x { print("value is \(value)") // 42를 출력합니다. }

이것은 x가 nil이 아닐 때 작동하며, 추가적인 타입 캐스팅을 하지 않습니다, 반면 as?는 그렇지 않습니다.

주제에 대한 세부 사항을 모르고 발생할 수 있는 실제 오류의 예


이야기

한 개발자가 여러 optional 바인딩을 하나의 표현식에서 if let을 사용하여 수행하려 했지만, 튜플과 함께 패턴 매칭을 모르는 바람에 코드가 중첩된 if로 인해 복잡해졌습니다. 반면 올바른 해결책은 if case let (a?, b?) = (a, b)를 통해 검사들을 결합시켜 가독성과 안전성을 높일 수 있었을 것입니다.


이야기

if case .some(let value) = optional, value > 10 {...} 형태로 패턴 매칭을 수행했지만 nil의 가능성을 고려하지 않아, else 블록에는 10 미만의 값뿐만 아니라 nil도 포함되었습니다.


이야기

optional enum에 대해 잘못된 구조체를 사용했습니다(예: if case .some(let .myCase(value)) = x), 이로 인해 nil 값일 때 앱이 크래시가 발생했습니다. 올바른 방법은 먼저 if let으로 optional을 언래핑한 다음 enum에 대해 패턴 매칭을 수행하는 것입니다.