foreach mit stride iterieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • foreach mit stride iterieren

    Hi zusammen,

    ich hole mir aus einer Quelle mit Datumswerten den ersten und letzten Eintrag heraus. Da die Quelle nach Datum sortiert ist bekomme ich also das erste und letzte Datum.

    Nun möchte ich vom ersten bis zum letzten Datum monatsweise iterieren. Aber genau Monat für Monat, Ich habe nun folgenden Code:

    Quellcode

    1. ForEach (Array(stride(from: vmCKDb.timebands.first?.startdate ?? Date.now,
    2. to: vmCKDb.timebands.last?.startdate ?? Date.now,
    3. by: 86400 * 30)), id: \.self) { date in
    Das funktioniert zwar ganz gut, aber wenn ich immer in 30-Tage Schritte gehe, dann werde ich im schlechtesten Fall (z.B. 01.01. plus 30 Tage) im gleichen Monat landen.
    Kann ich mit dem "stride" auch genau monatsweise vorangehen?

    Vielen Dank für jeglichen Hinweis ... :thumbsup:
    :evil: ;( :( ... aller Anfang ist schwer ... ?( <X :evil:
  • Würde mich über ein Ergebnis hier freuen, weil es mich schon interessiert.
    Ich bekomme das Stride mit dem Datums-Increment nicht hin. Würde fast vorab mit einer while ein eigenes Array erzeugen.

    Quellcode

    1. let start = Date.now
    2. var tmp = start
    3. let end = Calendar.current.date(byAdding: .year, value: 1, to: start)
    4. var timeArray:[Date] = []
    5. while tmp < end! {
    6. timeArray.append(tmp)
    7. tmp = Calendar.current.date(byAdding: .month, value: 1, to: tmp) ?? Date.now
    8. }
  • So,

    ich habe es nun so umgesetzt:
    1. Definition der Variablen:

    Quellcode

    1. var body: some View {
    2. let firstDate: Date = vmCKDb.timebands.first?.startdate ?? Date.now
    3. let lastDate: Date = vmCKDb.timebands.last?.startdate ?? Date.now
    4. var firstDayOfMonth: Date = firstDayOfMonth(for: firstDate)!.adding(months: -1)


    2. Meine Schleife:

    Quellcode

    1. ForEach (firstDayOfMonth.nextDates(startDates: [firstDayOfMonth], endDate: lastDate, unit: .month, interval: 1), id: \.self) { date in


    3. eine Funktion zum Ermitteln aller Dates von Anfang bis Ende (nicht irritieren lassen weil ich ein Array Übergabe - das nutze ich noch für andere Use-cases):

    Quellcode

    1. func nextDates(startDates: [Date], endDate: Date, unit: Calendar.Component, interval: Int) -> [Date] {
    2. var allDates: [Date] = []
    3. var date: Date = Date.now
    4. for startDate in startDates {
    5. date = startDate
    6. while date <= endDate {
    7. date = Calendar.current.date(byAdding: unit, value: interval, to: date)!
    8. if date <= endDate {
    9. allDates.append(date)
    10. }
    11. } // end while
    12. } // end for
    13. if allDates.count > 0 {
    14. allDates = allDates.sorted()
    15. }
    16. return allDates
    17. } // end func
    Alles anzeigen


    So habe ich den gewünschten Effekt realisiert.
    :evil: ;( :( ... aller Anfang ist schwer ... ?( <X :evil:
  • freelancer schrieb:

    Korrekt, eine Extension zu Date !
    Wenn das eine Extension ist, dann würde ich den Aufruf

    firstDayOfMonth.nextDates(endDate: lastDate, unit: .month, interval: 1)

    und nicht

    firstDayOfMonth.nextDates(startDates: [firstDayOfMonth], endDate: lastDate, unit: .month, interval: 1)

    erwarten.


    nextDates() ist keine Method der Instanz, völlig unabhängig davon (wenn ich das auf die Schnelle richtig gesehen habe).