패턴 매칭

업무 중에 자주 헷갈려서 적어 놓습니다 :)..

swift의 pattern 중에 하나인데요. 공식 문서는 여기에 있습니다.

//옵셔널 값이 있을 때
let someOptional: Int? = 42

//이렇게 바인딩이 가능합니다. 
if case .some(let x) = someOptional {
  print(x)
}

//왜 ? 
//옵셔널이 아래와 같이 구현되어 있기 때문이죠. 
enum Optional<Wrapped> : ExpressibleByNilLiteral {
   case none
   case some(Wrapped)
}
//이런식으로도 바인딩이 가능한데요. 
if case let x? = someOptional {
  print(x) //42
}

//이것과는 뭐가 다를까요 ? 
//사실 이것과는 다를게 없습니다. 
if let x = someOptional {
  print(x) //42
}

//그런데, 아래와 같은 for 문에서의 case? 문법이 지원되지요. 
let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]
// Match only non-nil values.
for case let number? in arrayOfOptionalInts {
  print("Found a \(number)") 
  //Found a 2
  //Found a 3
  //Found a 5
}

//위의 문법을 사용하지 않는다면 이런식으로 작업해야겠죠. 
for number in arrayOfOptionalInts.compactMap({ $0 }) {
  print("Found a \(number)")
}

또, 자주 보는 패턴 중에 if case도 있는데요.

또, 엄~청 많이쓰는 case let도 있습니다. 조건은 연관값이 있을 때 사용할 수 있어요.

Rx에서도 하나의 예시를 들어볼 수 있을 것 같은데요. 장점은 enum에 있는 error를 한번에 가져올 수 있습니다. 예를 들면, 아래와 같습니다.

또, 우리 많이 쓰는 Result<MyModel, Error> 가 있잖아요? 이것도 switch 문으로 나눌 것 없이 둘중 하나의 케이스로만 사용해도 괜찮습니다.

Last updated