2

In the following example I am saving a String with @AppStorage:

struct ContentView: View {
    @AppStorage("text") private var text = ""

    var body: some View {
        Button("Append text: \(text)") {
            text.append("APPEND")
        }
    }
}

But I want to save a String array, something like this:

@AppStorage("text") private var text = [
    "APPEND",
    "APPEND"
]
Nikolass
  • 103
  • 1
  • 8
  • 1
    Does this answer your question? [How to Store Nested Arrays in @AppStorage for SwiftUI](https://stackoverflow.com/questions/63166706/how-to-store-nested-arrays-in-appstorage-for-swiftui) – drago Dec 10 '21 at 15:31
  • 1
    @drago it works but I want to have a [] array, not [[]] ... – Nikolass Dec 10 '21 at 17:11

1 Answers1

4
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)")
    }
}}

VIEW_

struct ContentView: View {

@State var TempTextArray: [String] = []
@AppStorage("textArray", store: UserDefaults(suiteName: "group.de.domain.MyApp")) var items: Data = Data()

var body: some View {
    VStack(spacing: 30){
        Button("Append text:") {
            TempTextArray.append("Append")
            items = Storage.archiveStringArray(object: TempTextArray)
        }
        
        Button("GET String Array"){
            print(Storage.loadStringArray(data: items))
            
            
        }
    }
    
}}
AdR
  • 572
  • 1
  • 4
  • 13