관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - SwiftUI] Combine Selecting 연산자 (first, last, tryFirst, tryLast, output) 본문

iOS Combine (SwiftUI)

[iOS - SwiftUI] Combine Selecting 연산자 (first, last, tryFirst, tryLast, output)

jake-kim 2022. 11. 13. 23:02

목차) Combine - 목차 링크

Selecting 연산자

* Combine에서 제공하는 Selecting 연산자는 기존 Swift에서 제공하는 연산자의 인터페이스와 동일하게 설계되어 사용하기 쉽도록 구현

  • first()
[1,2,3,4,5].publisher
  .first()
  .sink { print($0) }
// 1
  • last()
[1,2,3,4,5].publisher
  .last()
  .sink { print($0) }
  // 5
  • tryFirst
    • 조건에 해당하는 firrst를 만나기 전까지 throw가 발생 안하면 에러 x
struct SomeError: Error {}
[1,2,3,4,5].publisher
  .tryFirst(where: {
    guard $0 != 3 else { throw SomeError() }
    return $0 % 2 == 0
  })
  .sink(receiveCompletion: { print($0 )}, receiveValue: { print($0) })
// 2
// finished
  • tryLast
    • Sequence 마지막까지 순회하면서 throw가 없으면 조건에 해당하는 값 방출
[1,2,3,4,5].publisher
  .tryLast(where: {
    guard $0 != 3 else { throw SomeError() }
    return $0 % 2 == 0
  })
  .sink(receiveCompletion: { print($0 )}, receiveValue: { print($0) })
// failure(.SomeError())
  • output(in:)
    • 인덱스에 해당하는 값을 방출하며, 만약 인덱스가 범위를 벗어나면 에러는 나지 않고 finished 이벤트가 방출
[1,2,3,4,5].publisher
  .output(at: 6)
  .sink(receiveCompletion: { print($0 )}, receiveValue: { print($0) })
// 4

[1,2,3,4,5].publisher
  .output(at: 6)
  .sink(receiveCompletion: { print($0 )}, receiveValue: { print($0) })
// finished
Comments