Publishers.CompactMap

μ œλ„€λ¦­ ꡬ쑰체 | 받은 각각의 μš”μ†Œμ— λŒ€ν•˜μ—¬ ν΄λ‘œμ €λ₯Ό ν˜ΈμΆœν•˜μ—¬ nil이 μ•„λ‹Œ κ²°κ³Όλ₯Ό λ‹€μ‹œ λ°œν–‰ν•˜λŠ” Publisher

μ΄λ‹ˆμ…œλΌμ΄μ €λŠ” 두 개의 인자λ₯Ό λ°›λŠ”λ‹€.

  • upstream : μƒμœ„μ— 흐λ₯΄λŠ” Publisher

  • transform : μƒμœ„μ— 흐λ₯΄λŠ” Publisherλ‘œλΆ€ν„° 값을 λ°›κ³  μ˜΅μ…”λ„ 값을 λ°˜ν™˜ν•˜λŠ” ν΄λ‘œμ €

Swift의 compactMap ν•¨μˆ˜μ™€ 같은 λ™μž‘μ„ ν•œλ‹€.

μ‹œν€€μŠ€μ—μ„œ nil 값을 μ—†μ• λŠ” λ“±μ˜ μž‘μ—…μ„ ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•  수 μžˆλ‹€.

compactMap μ˜€νΌλ ˆμ΄ν„°μ™€ 관련이 μžˆλ‹€.

// Publishers.CompactMap Publisher
Publishers.CompactMap(upstream: Publishers.Sequence<[Int?], Never>(sequence: [1, nil, 2])) { $0 }
  .sink(receiveCompletion: { completion in
    switch completion {
    case .failure:
      print("Combine CompactMap Error")
    case .finished:
      print("Combine CompactMap Finish")
    }
  }, receiveValue: { value in
    print("Combine CompactMap : \(value)")
  })
  .store(in: &cancellables)

// compactMap Operator
Publishers.Sequence<[Int?], Never>(sequence: [1, nil, 2])
  .compactMap { $0 }
  .sink(receiveCompletion: { completion in
    switch completion {
    case .failure:
      print("Combine CompactMap Error")
    case .finished:
      print("Combine CompactMap Finish")
    }
  }, receiveValue: { value in
    print("Combine CompactMap : \(value)")
  })
  .store(in: &cancellables)

// Combine CompactMap : 1
// Combine CompactMap : 2
// Combine CompactMap Finish

RxSwift

compactMap μ˜€νΌλ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆλ‹€.

Observable.from([1, nil, 2])
  .compactMap { $0 }
  .subscribe(onNext: { value in
    print("RxSwift CompactMap : \(value)")
  }, onError: { _ in
    print("RxSwift CompactMap Error")
  }, onCompleted: {
    print("RxSwift CompactMap Finish")
  })
  .disposed(by: disposeBag)

// RxSwift CompactMap : 1
// RxSwift CompactMap : 2
// RxSwift CompactMap Finish

ReactiveSwift

filterMap μ˜€νΌλ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆλ‹€.

SignalProducer([1, nil, 2])
  .filterMap { $0 }
  .start { event in
    switch event {
    case let .value(value):
      print("ReactiveSwift CompactMap : \(value)")
    case .failed:
      print("ReactiveSwift CompactMap")
    case .completed:
      print("ReactiveSwift CompactMap")
    default:
      break
    }
  }

// ReactiveSwift CompactMap : 1
// ReactiveSwift CompactMap : 2
// ReactiveSwift CompactMap Finish

Last updated

Was this helpful?