Programmieren einer Lagerverwaltung mit Swift, Xcode Konsole

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

  • Programmieren einer Lagerverwaltung mit Swift, Xcode Konsole

    Hallo liebe Programmierkameraden :) bräuchte mal bitte eure Hilfe bzw. Unterstützung. Bin für jede Hilfe, jeden Lösungsvorschlag sehr dankbar !!!

    Muss ein Programm (Lagerverwaltung) erstellen das folgende Anforderungen erfüllt:

    Erstellen Sie eine Lagerverwaltung, die folgende Daten für Kisten speichern kann:

    - eine eindeutige Nummer zur Identifikation jeder einzelnen Kiste,
    - die Breite, Länge und Höhe jeder Kiste
    - das Volumen der Kiste

    Die Nummer der Kiste kann nach einem beliebigen Schema selbst vergeben werden. Stellen Sie aber durch geeignete Verfahren sicher, dass bei der Eingabe einer neuen Kiste nicht eine bereits vergebene Nummer benutzt wird.
    Das Volumen der Kiste soll automatisch vom Programm anhand der Breite, Länge und Höhe berechnet werden können.

    Das Programm soll folgende Funktionen anbieten:

    - Eingabe einer neuen Kiste,
    - Löschen einer vorhandenen Kiste,
    - Ändern der Daten einer vorhandenen Kiste,
    - Anzeigen der Daten einer vorhandenen Kiste,
    - Eine Listenfunktion, die die Daten aller vorhandenen Kisten anzeigt.

    Beim Löschen, Ändern und Anzeigen soll der Zugriff auf die Daten der Kiste über die Nummer der Kiste erfolgen.

    Für die Umsetzung gelten folgende Vorgaben:

    - Speichern Sie die Daten in einer Struktur.
    - Stellen Sie sicher, dass beim Zugriff auf die Daten der Kisten die Arraygrenzen nicht überschritten werden.
    - Erstellen Sie für das Eingeben, Löschen, Ändern, Anzeigen und Auflisten jeweils eigene Funktionen.
    - Erstellen Sie ein Auswahlmenü für den Zugriff auf die einzelnen Funktionen der Lagerverwaltung.
  • Mac & i Test Abo
  • djimodj schrieb:

    Bin für jede Hilfe, jeden Lösungsvorschlag sehr dankbar !!!
    Wie stellst Du Dir diese Hilfe vor? Du hast (aus dem Info-Unterricht?) eine konkrete Aufgabenstellung. Wir können aber nicht wissen, welche Kenntnisse Du hast und welche Gedanken Du Dir schon gemacht hast.

    Solltest Du nicht keine Idee haben, nimm ein Papier und male einmal los: Wie sind die Daten aufgebaut, welche Funktionen brauchst Du, wie könnte die GUI aussehen. Versuche, diese drei Aspekte gedanklich zu separieren, dann bist Du auf einem guten Weg Richtung MVC...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Ich bin kompletter Neuling in diesem Forum und der Programmierung. Beim Schmökern im Forum bin ich über die Aufgabenstellung von djimodj gestolpert. Ich habe mich mal an einer Lösung versucht. Ich bin gespannt auf euer Feedback. (Bitte seid aber gnädig ;-), wie gesagt, ich bin wirklich absoluter Neuling und daher ist mein Ansatz bestimmt nicht der Optimalste!). Denn ich denke die Eine oder Andere Sache kann man bestimmt eleganter lösen und daher interessiert es mich brennend wie ihr als erfahrenere Entwickler das vielleicht gelöst hättet oder wie eure Meinung zu meiner Lösung ist.
    Zusätzlich muss ich auch sagen, einige Teile der Aufgabenstellung kann ich nicht wirklich lösen. Da fehlt mir einfach das entsprechende KnowHow. Ich habe trotzdem mal meine Gedanken dazu aufgeschrieben. Der Quellcode und die Grundfunktionen sind aber als Command Line Tool lauffähig. Viel Spass beim Spielen mit meinem Ansatz. Und wie gesagt, gerne Feedback, man will ja auch was lernen. :)

    Umsetzen konnte ich:
    • Ein Menü über das die Funktionen aufgerufen werden können (diese funktionieren auch grundsätzlich):
      • Eingabe einer neuen Kiste,

      • Löschen einer vorhandenen Kiste,
      • Ändern der Daten einer vorhandenen Kiste,
      • Anzeigen der Daten einer vorhandenen Kiste,
      • Eine Listenfunktion, die die Daten aller vorhandenen Kisten anzeigt.
    • Speicherung der Daten in einer Struktur
      • Dabei wird das Volumen automatisch berechnet

      • Zugriff auf die Kisten erfolgt über eine ID, die ich selbst vergebe (Achtung, die Vergabe ist dabei in meinen Augen nicht gut!)



    Nicht umsetzen konnte ich:
    • Die Vergabe der ID. Also grundsätzlich vergebe ich automatisch eine ID. Aber meine Vergabe läuft nach dem Prinzip, dass der Index aus dem Array der neu angelegten Kiste zugewiesen wird. Das funktioniert erst mal prima. Aber spätestens aber dem Zeitpunkt an dem man eine frühere Kiste mal löscht und man später wieder weitere anlegt, kann die ID doppelt vergeben werden. Das ist natürlich logisch, aber mir fällt hier kein besserer Ansatz ein. Vielleicht wäre natürlich noch eine Idee, dass man den Nutzer manuell eine ID eingeben lässt und einfach mit einer Kontrollschleife die Eingabe gegen den Bestand prüft und wenn die ID noch nicht verwendet wurde, die Eingabe akzeptiert und wenn sie bereits vergeben ist, den User auffordert eine neue einzugeben. Keine Ahnung ob dieser Ansatz vielleicht dann sogar der bessere wäre.
    • Mit dem Punkt: "Stellen Sie sicher, dass beim Zugriff auf die Daten der Kisten die Arraygrenzen nicht überschritten werden" konnte ich jetzt nicht direkt was anfangen. Bin mir nicht sicher was hier gemeint ist. Vermutlich, dass ein Versuch unterbunden wird, z.b. einen Index aufzurufen den es im Bestand nicht gibt. Also wenn ich 5 Kisten habe (Index 0 bis 4) und ich versuche die Kiste 9 zu löschen, soll das nicht möglich sein und nicht zum Absturz des Programms führen. Aber wie man so etwas umsetzt, mhhh keine Ahnung. Vielleicht mit einer Kontrollschleife und einem Count auf den Bestand. Da kann ich leider ebenfalls mit meinen Kenntnissen nicht helfen.


    Hier nun mein Ansatz. Der Quellcode ist wie erwähnt als Command Line Tool, grundsätzlich lauffähig, aber sicherlich nicht der Beste der jemals geschrieben wurde. Und es sind auch nicht alle Punkte wie in der Fragestellung umgesetzt. Ich freue mich auf Feedback. :)

    Brainfuck-Quellcode

    1. import Foundation
    2. struct Kiste {
    3. var id = 0
    4. var breite = 0.0
    5. var laenge = 0.0
    6. var hoehe = 0.0
    7. var volumen = 0.0
    8. }
    9. var Bestand = [Kiste]()
    10. func neueKisteErstellen(nummer : Int) -> Kiste{
    11. var tempKiste = Kiste()
    12. var eingabeDouble : NSString
    13. var eingabeInt : NSString
    14. // Automatische Vergabe Kisten ID anhand des Indexes (sicher aber keine gute Lösung, da in meinen Augen die Gefahr von Mehrfachvergabe der gleichen ID nach dem Löschen von Beständen droht!
    15. tempKiste.id = Bestand.count
    16. print("Sie erstellen nun eine Kiste mit der ID \(tempKiste.id)")
    17. // Eingabe Daten
    18. print("Geben Sie die Breite der neuen Kiste mit der ID \(tempKiste.id) ein:")
    19. eingabeDouble = readLine()!
    20. tempKiste.breite = eingabeDouble.doubleValue
    21. print("Geben Sie die Länge der neuen Kiste mit der ID \(tempKiste.id) ein:")
    22. eingabeDouble = readLine()!
    23. tempKiste.laenge = eingabeDouble.doubleValue
    24. print("Geben Sie die Höhe der neuen Kiste mit der ID \(tempKiste.id) ein:")
    25. eingabeDouble = readLine()!
    26. tempKiste.hoehe = eingabeDouble.doubleValue
    27. tempKiste.volumen = tempKiste.breite * tempKiste.laenge * tempKiste.hoehe
    28. print("Das Volumen Ihrer Kiste mit der ID \(tempKiste.id) ist \(tempKiste.volumen) ")
    29. print()
    30. print("Die Kiste wurde erstellt und dem Lagerbestand hinzugefügt!")
    31. print()
    32. return tempKiste
    33. }
    34. func anhaengen() {
    35. var neueKiste = neueKisteErstellen(1)
    36. Bestand.append(neueKiste)
    37. }
    38. // Kiste ändern
    39. func aendereKisteBestand() {
    40. var tempKiste = Kiste()
    41. var aendereK : NSString
    42. var eingabeDouble : NSString
    43. var eingabeInt : NSString
    44. print()
    45. print("Geben Sie die ID der Kiste ein, die geändert werden soll!")
    46. aendereK = readLine()!
    47. tempKiste.id = aendereK.integerValue
    48. print("Geben Sie die NEUE Breite der Kiste mit der ID \(tempKiste.id) ein:")
    49. eingabeDouble = readLine()!
    50. tempKiste.breite = eingabeDouble.doubleValue
    51. print("Geben Sie die NEUE Länge der Kiste mit der ID \(tempKiste.id) ein:")
    52. eingabeDouble = readLine()!
    53. tempKiste.laenge = eingabeDouble.doubleValue
    54. print("Geben Sie die NEUE Höhe der Kiste mit der ID \(tempKiste.id) ein:")
    55. eingabeDouble = readLine()!
    56. tempKiste.hoehe = eingabeDouble.doubleValue
    57. tempKiste.volumen = tempKiste.breite * tempKiste.laenge * tempKiste.hoehe
    58. print("Das Volumen Ihrer Kiste mit der ID \(tempKiste.id) ist \(tempKiste.volumen) ")
    59. Bestand[aendereK.integerValue].breite = tempKiste.breite
    60. Bestand[aendereK.integerValue].laenge = tempKiste.laenge
    61. Bestand[aendereK.integerValue].hoehe = tempKiste.hoehe
    62. Bestand[aendereK.integerValue].volumen = tempKiste.volumen
    63. print()
    64. print("Die Kiste wurde geändert!")
    65. print()
    66. }
    67. // Kiste löschen
    68. func loescheKisteBestand () {
    69. var tempKiste = Kiste()
    70. var loescheK : NSString
    71. print()
    72. print("Geben Sie die ID der Kiste ein, die gelöscht werden soll!")
    73. loescheK = readLine()!
    74. tempKiste.id = loescheK.integerValue
    75. Bestand.removeAtIndex(tempKiste.id)
    76. print("Die Kiste wurde gelöscht!")
    77. print()
    78. }
    79. // Details einer Kiste
    80. func detailsKisteBestand () {
    81. var auswahlKiste : NSString
    82. var tempID : Int
    83. print("Zu welcher Kiste wollen Sie die Details abrufen? Geben Sie bitte die ID der entsprechenden Kiste nun ein!")
    84. auswahlKiste = readLine()!
    85. tempID = auswahlKiste.integerValue
    86. print()
    87. print("Hier die gewünschten Informationen zu Ihrer ausgewählten Kiste.")
    88. print()
    89. print(Bestand[tempID])
    90. }
    91. // Ausgabe Lagerbestand
    92. func ausgabeBestand () {
    93. for var index = 0; index < Bestand.count; index++ {
    94. print(Bestand[index])
    95. print("Insgesamt befinden sich \(index+1) Kisten im Lager.")
    96. }
    97. }
    98. // Menü
    99. func Menue() {
    100. var Auswahl : String
    101. print()
    102. print("------------------------------------------")
    103. print("01 Neue Kiste hinzufügen")
    104. print("02 Vorhandene Kiste ändern")
    105. print("03 Vorhandene Kiste löschen")
    106. print("04 Detailansicht zu einer bestimmten Kiste")
    107. print("05 Alle Kisten als Liste ausgeben")
    108. print("------------------------------------------")
    109. print()
    110. print("Treffen Sie nun Ihre Auswahl!")
    111. Auswahl = readLine()!
    112. switch Auswahl {
    113. case "1", "01":
    114. print("Sie wollen eine neue Kiste erstellen und hinzufügen.")
    115. anhaengen()
    116. Menue()
    117. case "2", "02":
    118. print("Sie wollen eine vorhandene Kiste ändern.")
    119. aendereKisteBestand()
    120. Menue()
    121. case "3", "03":
    122. print("Sie wollen eine vorhandene Kiste löschen")
    123. loescheKisteBestand()
    124. Menue()
    125. case "4", "04":
    126. print("Sie möchten Details zu einer vorhandenen Kiste abrufen.")
    127. detailsKisteBestand()
    128. Menue()
    129. case "5", "05":
    130. print("Sie wollen den aktuellen Lagerbestand komplett einsehen.")
    131. ausgabeBestand()
    132. Menue()
    133. default:
    134. print("Sie haben keine gültige Auswahl getroffen, bitte versuchen Sie es erneut")
    135. Menue()
    136. }
    137. }
    138. //Programmstart
    139. Menue()
    Alles anzeigen
  • Hallo erstmal und willkommen im Forum :)

    Vorweg, ich find's super, dass du als Neuling dir selbstständig Aufgaben suchst und bei auftauchenden Schwierigkeiten in einer sehr ansprechenden Form nachhakst! Und nicht so bescheiden, deine Lösung ist doch alles andere als schlecht als Einstieg :)

    Einige Tipps (und vlt. als Hinweis, dass diese nur die für einen Anfänger pragmatischste Lösung darstellen sollen. Persönlich halte ich nichts davon, von vornherein mit einem Overflow an Optimierungspotential überschüttet zu werden. Hier und da paar Designmuster einwerfen, der Rest macht aber die Erfahrung..)

    • Xcode stellt dir an der linken Seitenleiste bereits einige Hilfestellungen zur Verfügung. Z.B. deklarierst du an einigen Stellen die Variable eingabeInt, benutzt sie aber nie.
    • Ähnlich verhält es sich mit der Zeile var neueKiste = neueKisteErstellen(nummer: 1). Hier kannst du das var ruhig durch ein let ersetzen, da du die Variable neueKiste nicht mehr veränderst.
    • Für die Vergabe von eindeutigen IDs gibt es viele Lösungen. Die einfachste, wenn auch nicht unbedingt schönste, ist es, den Wert einer Variable bei jedem hinzufügen einer Kiste hochzuzählen und jeweils als ID zu benutzen. Z.B. fügst du var global_ID = 0 als Klassenvariable hinzu, passt die Zeile in der du die ID setzt entsprechend an: tempKiste.id = global_ID und benutzt zum Einfügen ein Bestand.insert(neueKiste, at: global_ID) anstatt append. Ein global_ID += 1 im Anschluss natürlich nicht vergessen ;)
    • In deiner aenderKistenBestand-Methode denkst du zu kompliziert. Folgende Zeilen:
    • Quellcode

      1. Bestand[aendereK.integerValue].breite = tempKiste.breite
      2. Bestand[aendereK.integerValue].laenge = tempKiste.laenge
      3. Bestand[aendereK.integerValue].hoehe = tempKiste.hoehe
      4. Bestand[aendereK.integerValue].volumen = tempKiste.volumen
      Kannst du durch durch Bestand[aendereK.integerValue] = tempKiste ersetzen.
    • Die Zugriffssteuerung könntest du beispielsweise so regeln:

      Quellcode

      1. if(Bestand.count < dieAktuelleID){
      2. // Zugriff erlauben
      3. }
      4. // Hier aber nicht
    Der Index auf den du zugreifen willst, muss also kleiner (da 0-Indexierung von Arrays) als die aktuelle Anzahl von Elementen im Array sein.
    • Die Zeile print("Insgesamt befinden sich \(index+1) Kisten im Lager.") durch print("Insgesamt befinden sich \(Bestand.count) Kisten im Lager.") ersetzen und vor die Schleife schreiben. Zur Zeit gibst du bei jedem Schleifendurchlauf die Meldung aus.
    • Aktuell prüft du nach der Methode readLine() nicht ob eine Falscheingabe erfolgt ist, sondern sagst dem Programm mit dem hinten angestellten ! das da alles ok sein wird. Exemplarisch müsstest du z.B. folgende Zeile Auswahl = readLine()! durch if let Auswahl = readLine() { ersetzen. Die schließende Klammer nach dem if Block nicht vergessen.
    • Das Volumen berechnest du bisher jedes mal "per Hand". So eigentlich nichts daran auszusetzen. Unter Swift bieten sich die Computed Properties aber förmlich dafür an eingesetzt zu werden. var volumen = 0.0 ersetzt du durch:

      Quellcode

      1. var volumen: Double {
      2. get {
      3. return breite * laenge * hoehe
      4. }
      5. }
      Dadurch wird bei einem Aufruf der Variable Volumen der Codeblock in den geschweiften Klammern unter dem get aufgerufen, also dein berechnetes Volumen.
    Das wär auch schon alles, dass mir auf den ersten Blick aufgefallen wäre. Weiterhin Viel Spaß beim Programmieren! :)

    Gruß

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Spotlight ()

  • Hallo Spotlight,

    vielen Dank für deine Mühe, die Tipps und Ideen (und natürlich aufmunternden Worte). Was ich beim Nachvollziehen festgestellt habe, man denkt manchmal einfach zu kompliziert. Der Weg mit der Global ID und dem hochzählen ist eigentlich total simpel und ärgert mich darauf nicht gekommen zu sein.

    Auch der Weg mit der Zugriffsteuerung mittels If-Abfrage und dem Vergleich: Bestand versus Eingabe, ist eigentlich ebenfalls total simpel. Da merkt man halt das man oft viel zu kompliziert denkt. Ich habe die Änderungen ausprobiert und es funktioniert. Vielen Dank, ich habe wieder einiges gelernt.

    Den Part mit den den Computed Properties habe ich dabei noch nicht genauer betrachtet. Da muss ich mich erst mal grundlegend genauer einlesen. Sieht aber auf den ersten Blick tatsächlich nach einer eleganteren Lösung aus. Nochmals vielen Dank für das Feedback. :)

    lg
  • Hui, schwierig sich den ganzen Flamewar bezüglich der falschen Programmiersprache zu verkneifen... ;)
    Aber ich zeige mich stets bemüht.

    Hut ab für den Ansatz!
    Zu Deinen 'Nicht Umsetzen' Punkten:
    Die Sache mit der ID ist hier ein wenig schwierig, da stimme ich Dir zu.
    Wobei 'globale Variable' in Spotlights Beitrag nicht ganz die korrekte Bezeichnung ist, da es sich um eine Instanzvariable der Verwaltungsklasse handelt.

    Die Sache mit den Arraygrenzen ist simpel: Du hast 0 Kisten im Array und willst die erste Kiste ändern.
    Trifft auch auf 'Du hast 4 Kisten im Array und willst die 5. löschen' zu.
    Versuch das mal in Deinem Programm, dann wirst Du sehen, was gemeint ist.
    Hier wäre ein simples Vergleichen der ID mit der Größe des Arrays hilfreich, wenn Du bei der Sache mit dem Index bleibst.
    Wenn nicht (wegen des Löschens) musst Du über jede Kiste iterieren und prüfen, ob die ID existiert.


    Daher als Tipp zur Vereinfachung: 'Kiste löschen' ist nicht definiert.
    In einer ordentlichen Lagerverwaltung werden Kisten auch nicht gelöscht, sondern ausgeliefert.
    Du kannst also die Kiste um einen BOOL 'present' erweitern, der bei Erzeugung auf TRUE gesetzt wird.
    Du änderst ihn beim Löschen auf FALSE und nutzt diesen Flag dann in den jeweiligen Methoden:
    Löschen: 'Ist bereits ausgeliefert'.
    Bearbeiten: 'Ist bereits ausgeliefert'.
    Übersicht: ID + 'Ausgeliefert.'

    Wenn Du dann noch Filter für Statistiken hinzufügst kannst Du via Predicates Ergebnislisten ausgeben für 'Ausgelieferte Kisten', 'Rumstehende Kisten', 'Gesamtvolumen rumstehende Kisten', 'Gesamtvolumen ausgelieferte Kisten' etc.pp.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • smatron schrieb:

    Und wie gesagt, gerne Feedback, man will ja auch was lernen.
    Deine Funktion Menu() ist nicht gut implementiert. Du rufst in der Funktion nämlich die Funktion selbst wieder auf. Dadurch wächst der Call-Stack immer weiter an.
    Für sich wiederholende Aufgaben benutzt man Schleifen. Hier eine Beispielslösung:

    Brainfuck-Quellcode

    1. func Menue() {
    2. var Auswahl : String
    3. var running = true
    4. while running {
    5. print()
    6. print("------------------------------------------")
    7. print("01 Neue Kiste hinzufügen")
    8. print("02 Vorhandene Kiste ändern")
    9. print("03 Vorhandene Kiste löschen")
    10. print("04 Detailansicht zu einer bestimmten Kiste")
    11. print("05 Alle Kisten als Liste ausgeben")
    12. print("06 Programm beenden")
    13. print("------------------------------------------")
    14. print()
    15. print("Treffen Sie nun Ihre Auswahl!")
    16. Auswahl = readLine()!
    17. switch Auswahl {
    18. case "1", "01":
    19. print("Sie wollen eine neue Kiste erstellen und hinzufügen.")
    20. anhaengen()
    21. case "2", "02":
    22. print("Sie wollen eine vorhandene Kiste ändern.")
    23. aendereKisteBestand()
    24. case "3", "03":
    25. print("Sie wollen eine vorhandene Kiste löschen")
    26. loescheKisteBestand()
    27. case "4", "04":
    28. print("Sie möchten Details zu einer vorhandenen Kiste abrufen.")
    29. detailsKisteBestand()
    30. case "5", "05":
    31. print("Sie wollen den aktuellen Lagerbestand komplett einsehen.")
    32. ausgabeBestand()
    33. case "6", "06":
    34. running = false
    35. default:
    36. print("Sie haben keine gültige Auswahl getroffen, bitte versuchen Sie es erneut")
    37. }
    38. }
    39. }
    Alles anzeigen
  • Hallo,
    die Ansätze waren richtig hilfreich. Wo ich aber immer noch nicht mit klar komme, ist, wie man die id in dem Array eindeutig macht.
    Wenn ich z.B. die Kisten 1,2,3,4 eingebe und dann Kiste 2 wieder lösche, habe ich die ID 1,3,4 vergeben.
    Will ich nun eine neue Kiste angeben, wird die ID 4 nochmal vergeben, sprich 1,3,4,4

    Gibt eine Sonderfunktion, die immer die höchste ID +1 benutzt?

    Gruß
    André
  • Schreibe Dir eine solche Funktion, die z.B.
    • die maximale ID + 1 oder
    • die erste unbelegten ID
    zurückliefert. Beides erfordert ein Iterieren durch Dein Array, wobei der zweite Weg potentiell schneller ist (weil er nach einer gefundenen Lücke abbrechen kann). Oder erreichne Dir die ID vollkommen unabhändig, z. B. aus einer Kombination von Zeit- und Geräte-Daten. UUID ist das Stichwort...

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


    • ich denke hier an den Befehl max: let hoechste = max(tempkiste.id).

    Wenn ich das so versuche, bekomme ich immer einen Fehler "Cannot invoke 'max' with an Argument List of type '(Int)'
    Keine Ahnung von Swift, aber Google behauptet im zweiten Treffer bei SO, ein "... as Int" würde helfen, damit klar ist, welchen Datentypen der Rückgabewert haben soll.

    Ich habe nun aber nicht nachvollzogen, ob tempkiste.id wirklich ein Array von IDs liefert, klingt eher weniger so. Ich würde im Zweifelsfall händisch durch die Elemente iterieren.

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

    ich denke hier an den Befehl max: let hoechste = max(tempkiste.id).

    Wenn ich das so versuche, bekomme ich immer einen Fehler "Cannot invoke 'max' with an Argument List of type '(Int)'

    Wie wäre es mit

    Quellcode

    1. let kistemithoechsterid = kistenarray.max(by: {$0.id < $1.id})
    Liefert das Kistenobjekt mit der höchsten id-property als ein Optional zurück.
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?