Swift - SwiftUI Article

AppStorage - Array Speichern

event 11. Mai 2021

Lange habe ich überlegt wie ich Arrays in @AppStorage speichern kann. Meine Intention war ein Array von der App an die Widgets zu übergeben. Im folgenden werde ich meine Lösung darstellen. Mit meiner Lösung kann ich String, Int, Double und gar UIColor Arrays speichern.

Ich erstelle eine Klasse die ich dem NSObject zuweise und dann zwei Funktionen schreibe.


    class Storage: NSObject {

        static func archiveStringArray(object : [String]) -> Data {
            do {
                let data = try NSKeyedArchiver.archivedData(withRootObject: object, requiringSecureCoding: false)
                return data
            } catch {
                fatalError("Can't encode data: \(error)")
            }

        }

        static func loadStringArray(data: Data) -> [String] {
            do {
                guard let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? [String] else {
                    return []
                }
                return array
            } catch {
                fatalError("loadWStringArray - Can't encode data: \(error)")
            }
        }
    }

Die erste Funktion hilf uns das Array, in dem Fall das String Array zu archivieren als reine Daten. Die zweite Funktion übergibt dann wieder die Daten als (String) Array.

Hier kurz eine Beispiel Anwendung - Code Beispiel:


    @AppStorage(„nameArray", store: UserDefaults(suiteName: "group.de.domain.MyApp“))
    var nameArray: Data = Data()

    var tempArray = ["David", "Caro", "Adrian"]

    //Save Array
    nameArray = Storage.archiveDoubleArray(object: tempArray)

    //Retrieve Array Example (SwiftUI)

    ForEach(0..<{getStrings(data: entry.nameArray)).count) { i in
            Text(getStrings(data: entry.nameArray)[I])
                                            
    }
    
    func getStrings(data: Data) -> [String] {
        return Storage.loadStringArray(data: data)
    }

Zuerst speichern wir das temporäre Array im @AppStorage, welches Daten zu geordnet ist und wir archivieren es. Dann können wir das gespeicherte Daten Array wieder auspacken und es wieder als Array aufrufen. Hier in diesem Beispiel geben wir mit einer Schleife alle Namen wieder.

Wie schon gesagt kann man nicht nur ein String Array speichern. Hier bspw. mit einem UIColor Array:


    class Storage: NSObject {

        static func archiveColorArray(object : [UIColor]) -> Data {
            do {
                let data = try NSKeyedArchiver.archivedData(withRootObject: object, requiringSecureCoding: false)
                return data
            } catch {
                fatalError("Can't encode data: \(error)")
            }
    
        }
    
        static func loadColorArray(data: Data) -> [UIColor] {
            do {
                guard let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? [UIColor] else {
                    return []
                }
                return array
            } catch {
                fatalError("loadWStringArray - Can't encode data: \(error)")
            }
        }
    }

Das ist nur eine Lösung um Arrays in @AppStorage zu speichern. Natürlich gibt es verschiedene andere Lösungen und vielleicht, in der nächsten WWDC, wird es möglich sein leichter Arrays zu speichern.

swift swiftui
David Koenig Swift Developer

David Koenig

Swift Developer & Autor