Sequence Operators
min
min 연산자를 사용하면 publisher가 방출한 최소값을 찾을 수 있습니다.
최소값을 알기 위해서 publisher가 .finish 완료 이벤트를 보낼 때까지 기다립니다.
값이 Comparable을 준수하지 않는다면 min(by:)를 사용하면 됩니다.
enum Rank: Int {
case ace = 1, two, three, four, five, six, seven, eight, nine, ten, jack, queen, king
}
let cards: [Rank] = [.five, .queen, .ace, .eight, .king]
cancellable = cards.publisher
.min {
return $0.rawValue < $1.rawValue
}
.sink { print("\($0)") }
// *--- RESULT ---*
// "ace"
max
min과 반대로 최대값을 찾으며, 연산자는 greedy 합니다.
max(by:) 연산자가 존재합니다.
first
첫 번째로 방출된 값을 통과시킨다음 완료합니다.
let numbers = (-10...10)
cancellable = numbers.publisher
.first()
.sink { print("\($0)") }
// *--- RESULT ---*
// -10
let publisher = ["J", "O", "H", "N"].publisher
publisher
.print("publisher")
.first(where: { "Hello World".contains($0) })
.sink(receiveValue: { print("First match is \($0)") })
// *--- RESULT ---*
// publisher: receive subscription: (["J", "O", "H", "N"])
// publisher: request unlimited
// publisher: receive value: (J)
// publisher: receive value: (O)
// publisher: receive value: (H)
// publisher: receive cancel
// First match is H
last
마지막 값을 내보냅니다. greedy 하기 때문에 publisher가 완료될 때까지 기다려야 합니다.
first와 마찬가지로 last(where:) 연산자가 있어서 술어와 일치하는 마지막 값을 내보냅니다.
output
output(at:) 연산자는 해당 인덱스의 값을 내보냅니다.
해당 인덱스의 값이 존재하지 않는다면 방출되는 것은 없습니다.
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
numbers.publisher
.output(at: 6)
.sink { print("\($0)") }
// *--- RESULT ---*
// 7
output(in:) 연산자는 지정된 인덱스 범위 내에 있는 값을 내보냅니다.
let numbers = [1, 1, 2, 2, 2, 3, 4, 5, 6]
numbers.publisher
.output(in: (3...5))
.sink { print("\($0)", terminator: " ") }
// *--- RESULT ---*
// 2 2 3
output은 해당 위치의 값을 내보냈다면 구독을 취소합니다.
count
publisher가 .finished 완료 이벤트를 전송하면 upstream publisher가 얼마나 많은 값을 전송했는지 나타내는 숫자를 내보냅니다.
let numbers = (0...10)
cancellable = numbers.publisher
.count()
.sink { print("\($0)") }
// *--- RESULT ---*
// 11
contains
upstream publisher에서 지정된 값을 반환하면 참을 반환하고 구독을 취소합니다.
반환된 값 중 지정된 값과 동일한 값이 없으면 거짓을 반환합니다.
let numbers = [-1, 5, 10, 5]
numbers.publisher
.print("publisher")
.contains(5)
.sink { print("\($0)") }
// *--- RESULT ---*
// publisher: receive subscription: ([-1, 5, 10, 5])
// publisher: request unlimited
// publisher: receive value: (-1)
// publisher: receive value: (5)
// publisher: receive cancel
// true
numbers.publisher
.print("publisher")
.contains(6)
.sink { print("\($0)") }
// *--- RESULT ---*
// publisher: receive subscription: ([-1, 5, 10, 5])
// publisher: request unlimited
// publisher: receive value: (-1)
// publisher: receive value: (5)
// publisher: receive value: (10)
// publisher: receive value: (5)
// publisher: receive finished
// false
Comparable에 맞지 않는 방출된 값이라면, contains(where:)를 사용하면 해결할 수 있습니다.
allSatisfy
수신된 모든 값이 주어진 술어를 통과하는지 여부를 Bool 값으로 내보냅니다.
let targetRange = (-1...100)
let numbers = [-1, 0, 10, 5]
numbers.publisher
.allSatisfy { targetRange.contains($0) }
.sink { print("\($0)") }
// *--- RESULT ---*
// true
reduce
모든 값이 클로저를 적용하고 누적된 값을 생성하여 내보냅니다.
upstream publisher로부터 오류를 수신하면 이를 내보내고, 누적된 값은 내보내지 않고 종료됩니다.
let numbers = (0...10)
cancellable = numbers.publisher
.reduce(0, { accum, next in accum + next })
.sink { print("\($0)") }
// *--- RESULT ---*
// 55
'Language > Swift' 카테고리의 다른 글
[Swift] Reactive Programming Combine - Debugging (0) | 2024.05.19 |
---|---|
[Swift] Reactive Programming Combine - Networking (0) | 2024.05.16 |
[Swift] Reactive Programming Combine - 6: Time manipulation (0) | 2024.05.16 |
[Swift] Reactive Programming Combine - 5: Combining Operators (0) | 2024.05.11 |
[Swift] Reactive Programming Combine - 4: Filtering Operators (0) | 2024.05.08 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!