let numbers = (1...10).publisher
numbers.filter { $0 % 2 == 0 }
.sink {
print($0)
}
// 출력값
2
4
6
8
10
말 그래도 값을 필터링 해주는 Operator
let words = "apple apple apple fruit apple mango watermelon apple".components(separatedBy: " ").publisher
words
.removeDuplicates()
.sink {
print($0)
}
// 출력값
apple
fruit
apple
mango
watermelon
apple
removeDuplicates는 말 그대로 중복을 제거해준다.
주의할 점은 모든 중복 값을 제거하는 것이 아니라 연속되는 중복 값만 제거해 준다는 점이다.
let strings = ["a", "b", "1.24", "b", "3.14", "c"].publisher
strings.compactMap {
Float($0)
}.sink {
print($0)
}
// 출력값
1.24
3.14
compactMap은 nil을 제거해준다.
let numbers = (1...5000).publisher
numbers.ignoreOutput().sink(receiveCompletion: { print($0) }, receiveValue: { print($0) })
// 출력값
finished
원래는 1부터 5000까지의 수가 출력되어야 하지만 ignoreOutput()을 넣게 되면 모든 output이 무시되어 completion에서 finished만 출력된다.
let numbers = (1...9).publisher
numbers.first(where: { $0 % 2 == 0 })
.sink {
print($0)
}
// 출력값
2
where의 조건에 해당하는 첫 번째 output만 전달한다.
let numbers = (1...9).publisher
numbers.last(where: { $0 % 2 == 0 })
.sink {
print($0)
}
// 출력값
8
where의 조건에 해당하는 마지막 output만 전달한다.
let numbers = (1...10).publisher
numbers.dropFirst(5).sink {
print($0)
}
// 출력값
6
7
8
9
10
dropFirst(_ count:Int)
를 사용하여 count 만큼의 최초 output을 무시할 수 있다.
let numbers = (1...10).publisher
numbers.drop(while: { $0 % 3 != 0 })
.sink {
print($0)
}
// 출력값
3
4
5
6
7
8
9
10
drop(while: )
을 사용하여 while 조건을 만족하기 전까지의 output을 무시할 수 있다.
let isReady = PassthroughSubject<Void, Never>()
let taps = PassthroughSubject<Int, Never>()
taps.drop(untilOutputFrom: isReady).sink {
print($0)
}
(1...10).forEach {
taps.send($0)
if $0 == 3 {
isReady.send()
}
}
// 출력값
4
5
6
7
8
9
10
drop(untilOutputFrom: publisher)
를 사용하여 untilOutputFrom에 들어갈 publisher가 output을 발생시키기 전까지 본인의 output을 무시할 수 있다.
let numbers = (1...10).publisher
numbers.prefix(3).sink {
print($0)
}
// 출력
1
2
3
prefix() 를 사용하여 최초 몇회까지의 output을 사용할 것인지 지정할 수 있다.
numbers.prefix(while: { $0 < 3 }).sink {
print($0)
}
prefix(while: )을 사용하여 다양하게 활용가능하다.