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
nil
mit 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
nil
aussortieren:compactMap { }
-
Nur
completion
durchlassen: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
$0
größer (/kleiner)$1
wahr 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()
-
true
wenn mindestens ein Wert größer ist als 42:contains { $0 > 42 }
-
true
wenn alle Werte größer als 42 sind:allSatisfy { $0 > 42 }
-
Alle Werte addieren:
reduce(0, +)