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, +)