Array Filtern

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

  • Array Filtern

    Hallo Leute,
    meine ersten Gehversuche in Swift!
    Ich habe ein struct von folgenden Format

    Quellcode

    1. struct Kunde: Codable,Hashable{
    2. let NR: String
    3. let NAME: String
    4. let NAME2: String
    5. let STRASSE: String
    6. let PLZ: String
    7. let ORT: String
    8. let TELEFON1: String
    9. let EMAIL: String
    10. }

    Ich weise dem Array kunden Werte aus einer Datei zu! Funktioniert auch Prima.

    Quellcode

    1. import Foundation
    2. class ViewKunden: ObservableObject {
    3. let kunden: [Kunde]
    4. init(){
    5. guard let url = Bundle.main.url(forResource: "kunden", withExtension: "json")
    6. else { kunden = []
    7. return
    8. }
    9. do {
    10. let data = try Data(contentsOf: url)
    11. print(data)
    12. kunden = try JSONDecoder().decode([Kunde].self, from: data)
    13. } catch {
    14. print("Fehler beim Laden Kunden")
    15. print(error)
    16. kunden = []
    17. }
    18. }
    19. }
    Alles anzeigen
    Ich möchte das Array kunden jetzt auf eine Zeichenfolge filtern, die Zeichenfolge kann irgendwo im Array stehen.
    Also wenn ich "Köln" eingebe gibt er mir sowohl alle Kunden aus Köln aus und auch die Kunden die auf der Kölnerstrasse wohnen.
    Wie könnte ich das lösen?

    Danke für eure Mühe!
  • paul_otto schrieb:

    Ich möchte das Array kunden jetzt auf eine Zeichenfolge filtern, die Zeichenfolge kann irgendwo im Array stehen
    Soweit ich weiss, gibt es keine Möglichkeit, alle Elemente einer Struktur "automatisch" anzusprechen (ich lass' mich aber gerne korrigieren). Du müsstest also - z. B. in einer eigenen Funktion - alle Elemente prüfen, in denen der String gesucht werden soll und deren Ergebnisse dann bool'sch verknüpfen. So etwas is der Art wie hier mit den beiden Namen (nur trocken getippt):

    Quellcode

    1. if let foundIndex = kunden.firstIndex (where: {$0.NAME == searchString} && ($0.NAME2 == searchString) {
    2. [...]
    3. }
    Vielleicht macht es sogar mehr Sinn, eine Funktion zu schreiben, die ein Array der gefundenen Strukturen zurück gibt. Hier könntest Du dann count != 0 vergleichen und hättest auch direkt eine Ergebnisliste ... je nachdem, was Dein Programm machen soll.

    Mattes

    Edit: Ich hätte besser lesen sollen: Du willst ja tatsächlich eine "Ergebnisliste", also ein Array der passenden Elemente. Dann ist kunden.filter() (statt kunden.firstIndex()) Dein Freund...
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von MyMattes ()

  • Versuch mal

    Quellcode

    1. class viewKunden {
    2. func gefilterteKunden(suchtext: String) -> [Kunde] {
    3. let suchtextKlein = suchtext.lowercased()
    4. return kunden.filter { kunde in
    5. return
    6. kunde.NR.lowercased().contains(suchtextKlein) ||
    7. kunde.NAME.lowercased().contains(suchtextKlein) ||
    8. kunde.NAME2.lowercased().contains(suchtextKlein) ||
    9. kunde.STRASSE.lowercased().contains(suchtextKlein) ||
    10. kunde.PLZ.lowercased().contains(suchtextKlein) ||
    11. kunde.ORT.lowercased().contains(suchtextKlein) ||
    12. kunde.TELEFON1.lowercased().contains(suchtextKlein) ||
    13. kunde.EMAIL.lowercased().contains(suchtextKlein)
    14. }
    15. }
    16. }
    Alles anzeigen
    Aufruf dann:

    let gefiltert = viewKunden.gefilterteKunden(suchtext: "köln")
  • Sähe im ganzen dann so aus:

    Quellcode

    1. //
    2. // ContentView.swift
    3. // test
    4. //
    5. // Created by Mischa Heißmann on 28.03.25.
    6. //
    7. import SwiftUI
    8. struct ContentView: View {
    9. @State var filter: String = ""
    10. @State var kunden: [Kunde] = [
    11. Kunde(NR: "001", NAME: "Hans", NAME2: "Wurst", STRASSE: "Hauptstraße", PLZ: "83527", ORT: "Köln", TELEFON1: "08072 123456", EMAIL: "hans@wurst.de"),
    12. Kunde(NR: "002", NAME: "Peterchen", NAME2: "Mondfahrt", STRASSE: "Kölner Str. 3", PLZ: "22212", ORT: "Köln", TELEFON1: "0211 444666", EMAIL: "peterchen@mondfahrt.com")
    13. ]
    14. @State var kundenGefiltert: [Kunde] = []
    15. var body: some View {
    16. VStack {
    17. TextField("Eingabe", text: $filter)
    18. .onChange(of: filter) { _,_ in
    19. kundenGefiltert = viewKunden().gefilterteKunden(kunden: kunden, suchtext: filter)
    20. }
    21. ForEach(kundenGefiltert, id: \.self) { kunde in
    22. Text("\(kunde.NR) \(kunde.NAME) \(kunde.NAME2)")
    23. }
    24. }
    25. .padding()
    26. }
    27. }
    28. #Preview {
    29. ContentView()
    30. }
    31. struct Kunde: Codable,Hashable, Identifiable {
    32. var id: UUID = UUID()
    33. let NR: String
    34. let NAME: String
    35. let NAME2: String
    36. let STRASSE: String
    37. let PLZ: String
    38. let ORT: String
    39. let TELEFON1: String
    40. let EMAIL: String
    41. }
    42. class viewKunden {
    43. func gefilterteKunden(kunden: [Kunde],suchtext: String) -> [Kunde] {
    44. let suchtextKlein = suchtext.lowercased()
    45. return kunden.filter { kunde in
    46. return
    47. kunde.NR.lowercased().contains(suchtextKlein) ||
    48. kunde.NAME.lowercased().contains(suchtextKlein) ||
    49. kunde.NAME2.lowercased().contains(suchtextKlein) ||
    50. kunde.STRASSE.lowercased().contains(suchtextKlein) ||
    51. kunde.PLZ.lowercased().contains(suchtextKlein) ||
    52. kunde.ORT.lowercased().contains(suchtextKlein) ||
    53. kunde.TELEFON1.lowercased().contains(suchtextKlein) ||
    54. kunde.EMAIL.lowercased().contains(suchtextKlein)
    55. }
    56. }
    57. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von mihema ()