Swift Design Frage

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

  • Swift Design Frage

    Hallo,

    gegeben das folgende Szenario: Es werden Entitäten gelesen. Jede Entität hat einen bestimmten Typ. Von jedem Typ kann es beliebig viele Entitäten geben. Spätere Operationen darauf arbeiten immer Sortenrein, d.h. genau auf einen Typ.

    In Objective-C hätte ich jetzt aus den gelesenen Werten Objekte erzeugt und die wiederum sortenrein nach Typen in mehreren Arraya gespeichert. Diese Arrays mit den sortenreinen Objekten dann in ein Dictionary mit den Typ als Key. Schon fällt der Zugriff leicht.

    In Swift wird das mühsam, weil ja die Arrays Value-Types sind und jedesmal beim Einfügen/Lesen aus dem Dictionary kopiert werden, d.h. ein späteres Hinzufügen zu einem Array ändert ja nicht die Instanz im Dict. Klar, ich könnte jetzt NSArray-Objekte verwenden. Oder mir einen Klasse MeinObjektCollection schreiben und die statt Arrays verwenden. Aber gibt's da nicht was swiftigeres?

    ciao

    gandhi
  • Ich hoffe, dass ich deine Frage richtig verstanden habe. Die swiftigere Umsetzung für deinen Anwendungsfall dürfte etwas aufwändiger ausfallen. Anstatt direkt mit Dictionarys und Arrays zu arbeiten, schreibst du dir eine Verwaltungsklasse, die auf einem Dictionary mit Arrays basiert und die dir die gewünschten Operationen bereitstellt. Die lesenden Operationen sollten dabei weitestgehend wie im Dictionary-Array-Fall sein. Falls sie Collections zurückliefern, geben sie nur Read-Only-Objekte zurück. Für die schreibenden Operationen kann die Verwaltungsklasse dann immer direkt auf das Dictionary mit den Arrays zugreifen und Array-Verdoppelungen vermeiden.

    Durch den Copy-On-Write-Mechanismus der Collection-Klassen, sollte auch das zurückliefern der Arrays bei lesenden Operationen nicht allzu rechenintensiv sein.
    „Meine Komplikation hatte eine Komplikation.“
  • Ich weiß nicht, ob ich Deine Fragestellung insgesamt richtig verstanden habe, aber das

    gandhi schrieb:

    ein späteres Hinzufügen zu einem Array ändert ja nicht die Instanz im Dict.
    ist so nicht ganz richtig.

    Klar, wenn Du es so schreibst

    Quellcode

    1. var array = dict["Ints"]
    2. array?.append(42)

    wird durch die Änderung eine lokale Kopie erzeugt. Aber als Einzeiler wirkt sich die Änderung direkt auf das im Dictionary enthaltene Array/ Objekt aus.

    Quellcode

    1. dict["Ints"]?.append(42)

    Genauso kannst Du da auch an Ort und Stelle Änderungen vornehmen.

    Quellcode

    1. dict["Ints"]?[0] = 21

    Dummerweise muß man da gegebenenfalls den Fall berücksichtigen, daß zu dem Key noch kein Array vorhanden ist. Da kann man sich dann vereinfachende Funktionen zu seinem Dictionary schreiben. Etwa so:


    Quellcode

    1. extension Dictionary where Key == String, Value == [Any] {
    2. mutating func appendElement(_ element: Any, forKey key: String) {
    3. if self[key] == nil {
    4. self[key] = [element]
    5. }
    6. else {
    7. self[key]! += [element]
    8. }
    9. }
    10. }


    Hilft Dir das vielleicht etwas weiter?
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?