Suchoption bei Strukturen in einem Array

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

  • Suchoption bei Strukturen in einem Array

    Hallo liebe Community,

    gibt es eine Möglichkeit nach einem Eintrag in einer Struktur die sich in einem Array befindet zu suchen, und mir dann den entsprechenden Index des Arrays ausgibt?

    angenommen es gibt folgende Struktur:

    struct Artikel {
    var artikelnummer = 0
    var subfamilie = 0
    var preis = 0.0
    var bestand = 0
    }

    var lagerBekleidung = [Artikel]()

    angenommen der Artikel mit der Artikelnummer 007 ist nicht mehr vorhanden und soll gelöscht werden. Im Array "lagerBekleidung" befinden sich 10 Artikel (Index 0-9).007 befindet sich auf Index 6.
    Und wir denken noch etwas weiter damit es vielleicht noch etwas klarer wird was ich genau suche. Angenommen der Artikel mit der Artikelnummer 003 und 004 wurde bereits gelöscht und somit befindet sich Artikelnummer 007 nun nicht auf dem Index 6 sondern auf dem Index 4.
    Mir fehlt also eine Funktion, die mir irgendwie den aktuell passenden Index der Artikelnummer zurückliefert.

    Ich hoffe ich habe mich verständlich ausgedrückt ?(

    Ich hoffe irgendwer hat eine Idee :thumbsup:

    Vielen Dank schon mal für entsprechende Hilfe.
  • Mac & i Test Abo
  • MCDan schrieb:

    The index of the first element for which predicate returns true.

    Smoothcode schrieb:

    Ok, er wirft mir dann ein true zurück, aber damit komme ich ja immer noch nicht auf die IndexNr. des Arrays oder übersehe ich jetzt was?
    ?(

    Lies‘ doch bitte genau oder probiere den Tipp besser noch aus. Auch ohne Swift-Kenntnisse erscheint mir dies genau die gesuchte Funktion zu sein ... Du musst halt „nur“ das Predicate richtig definieren.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Smoothcode schrieb:

    Ich hatte mir nur die Definition angeschaut und die ergab für mich nur ein true oder nil.
    Na ja, der Rückgabetyp der Methode ist Int?. Das ist nicht true oder nil. ;)

    Für den hier beschriebenen Fall, dass du ein Element mit bestimmten Suchkriterien aus dem Array löschen willst, kannst du alternativ auch die Methode

    removeAll(where:)

    verwenden. Die macht das dann in einem Rutsch.
  • Michael schrieb:

    Für den hier beschriebenen Fall, dass du ein Element mit bestimmten Suchkriterien aus dem Array löschen willst, kannst du alternativ auch die Methode


    removeAll(where:)

    verwenden. Die macht das dann in einem Rutsch.
    Ohne weitere Annahmen zu machen, dann ist nicht sichergestellt, dass eine Artikelnummer nur einmal vorkommt. Somit ist removeAll(where:) die erste Wahl.

    Wenn sichergestellt ist, dass es keinen Artikel mit der gleichen Artikelnummer gibt, dann möchte man eigentlich ein removeFirst(where:) haben. Da bietet sich ja fast eine Extension an, die z.B. so aussehen kann:

    Python-Quellcode

    1. import Cocoa
    2. extension Array {
    3. mutating func removeFirst(where shouldBeRemoved: (Element) throws -> Bool) throws -> Element? {
    4. guard let idx = try self.firstIndex(where: shouldBeRemoved) else {
    5. return nil
    6. }
    7. return self.remove(at: idx)
    8. }
    9. }
    10. struct Article {
    11. var number: UInt = 0
    12. var category: String? = nil
    13. var price: UInt = 0 // in cents
    14. var stock: UInt = 0
    15. }
    16. var articles = [Article]()
    17. articles.append(Article.init(number: 1, category: "foo", price: 123, stock: 11))
    18. articles.append(Article.init(number: 2, category: "foo", price: 234, stock: 22))
    19. articles.append(Article.init(number: 3, category: "foo", price: 345, stock: 33))
    20. articles.append(Article.init(number: 4, category: "foo", price: 456, stock: 44))
    21. let a = try? articles.removeFirst(where: { $0.number == 3 })
    22. print("found: \(String(describing: a))")
    Alles anzeigen