AppStorage (Save Array) – Array speichern

Ich habe lange darüber nachgedacht, wie ich Arrays im AppStorage speichern kann. Meine Intention war es, ein Array von der App an die Widgets zu übergeben. Im Folgenden stelle ich meine Lösung vor. Mit meiner Lösung kann ich String-, Int-, Double- und sogar UIColor-Arrays speichern.

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

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 {
             let allowedClasses = [NSArray.self, NSString.self]
    guard let array = try NSKeyedUnarchiver.unarchivedObject(ofClasses: allowedClasses, from:data) as? [String] else {
        return []
    }
            return array
        } catch {
            fatalError("loadWStringArray - Can't encode data: \(error)")
        }
    }
}

Die erste Funktion hilft uns, das Array, in diesem Fall das String-Array, als reine Daten zu archivieren. Die zweite Funktion gibt die Daten dann als (String-)Array zurück.

Hier ist eine Beispielanwendung – Codebeispiel:

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

var tempArray = ["David", "Caro", "Adrian"]
            
//Save Array
nameArray = Storage.archiveStringArray(object: tempArray)

Array abrufen:

//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)
}

Zunächst speichern wir das temporäre Array im AppStorage, dem die Daten zugeordnet sind und archivieren es. Anschließend können wir das gespeicherte Daten-Array entpacken und als Array wieder aufrufen. In diesem Beispiel durchlaufen wir alle Namen.

Wie gesagt, man kann nicht einfach ein String-Array speichern. Hier zum Beispiel 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 {
            let allowedClasses = [NSArray.self, UIColor.self]
    guard let array = try NSKeyedUnarchiver.unarchivedObject(ofClasses: allowedClasses, from:data) as? [UIColor] else {
        return []
    }
            return array
        } catch {
            fatalError("loadWStringArray - Can't encode data: \(error)")
        }
    }
}

Dies ist nur eine Lösung zum Speichern von Arrays in AppStorage. Natürlich gibt es noch viele andere Lösungen und vielleicht wird es auf der nächsten WWDC möglich sein, Arrays einfacher zu speichern.

You can also find the article in English, on Medium (Sie finden den Artikel auch auf Englisch auf Medium): https://dkoenig.medium.com/appstorage-save-array-6fcd71089c54

Author: David
Meine bevorzugten Programmiersprachen sind und bleiben Swift, Dart, GDScript und Python. Außerdem verfüge ich über gute Kenntnisse in Objective-C (und Webentwicklung).