Filter - wurzelsand/swift-memos GitHub Wiki
Filter
Themen
drop(untilOutputFrom:),filter, ...
Aufgabe
Gegeben ist ein Publisher, der eine Sequenz aus tausend Zahlen sendet:
(1...1000).publisher
Im Hintergrund soll eine Schleife tausend Mal nichts tun:
(1...1000).forEach { _ in }
Nach dieser Verzögerung soll der Hintergrundprozess den Publisher dazu bringen, seine aktuelle Zahl auszugeben.
Ausführung
var subscriptions = Set<AnyCancellable>()
let stop = PassthroughSubject<Void, Never>()
DispatchQueue.global().async {
(1...1000).forEach { _ in }
stop.send()
}
(1...1000).publisher
.drop(untilOutputFrom: stop)
.first()
.sink { print("value:", $0) }
.store(in: &subscriptions)
Beispielausgabe:
value: 748
Anmerkungen
Weitere Filter:
.filter { $0.isMultiple(of: 2) }
.removeDuplicates()
.compactMap { Int($0) }
.first()
.first(where: { $0.isMultiple(of: 2) })
.last()
.last(where: { $0.isMultiple(of: 2) })
.dropFirst(3)
.drop(while: { $0.isMultiple(of: 2) }
.drop(untilOutputFrom: stop)
.prefix(3)
.prefix(while: { $0.isMultiple(of: 2) }
.prefix(untilOutputFrom: stop)
-
Jedes
nilmit einem bestimmten Wert ersetzen:replaceNil(with:) -
Wenn nichts gesendet wurde (auch nicht
nil!), dennoch einen Wert senden:replaceEmpty(with:) -
Nur Werte durchlassen, die ein Kriterium erfüllen:
filter { } -
Aufeinanderfolgende Wiederholungen entfernen:
removeDuplicates() -
Die Elemente eines Arrays umwandeln und
nilaussortieren:compactMap { } -
Nur
completiondurchlassen:ignoreOutput() -
Nur ersten (/letzten) Wert der ein Kriterium erfüllt, durchlassen:
first { } // (last { }) -
Die ersten 42 Werte überspringen:
dropFirst(42) -
Alle Werte überspringen, solange ein Kriterium erfüllt ist:
drop { } -
Nur die ersten 42 durchlassen, dann beenden:
prefix(42) -
Nur solange ein Kriterium erfüllt ist, Werte durchlassen und beenden:
prefix { } -
Nur den größten (/kleinsten) Wert durchlassen. Dabei optional Closure benutzen in dem
$0größer (/kleiner)$1wahr ergibt:max { } // (min { }) -
Nur den 2. Wert (Index = 1) durchlassen:
output(at: 1) -
Nur den 2. bis zum 4. Wert durchlassen:
output(in: 1...3) -
Nur die Anzahl der veröffentlichten Werte ausgeben:
count() -
truewenn mindestens ein Wert größer ist als 42:contains { $0 > 42 } -
truewenn alle Werte größer als 42 sind:allSatisfy { $0 > 42 } -
Alle Werte addieren:
reduce(0, +)