arrays - 如何在 SwiftUI 的 @AppStorage 中存储嵌套数组

标签 arrays swift swiftui nsuserdefaults swiftui-list

@AppStorage最近在 SwiftUI 中引入,似乎可以替代 UserDefaults .
我正在尝试制作 @AppStorage能够存储嵌套列表。
对于简单的情况,你会做

@AppStorage("selected") var selected = 0
我在处理普通的 UserDefaults 时使用了这个:
@Published var list = UserDefaults.standard.array(forKey: "nestedList") as? [[String]] ?? [[String]]()
长话短说,我如何转换普通的旧 UserDefuaults到新的属性包装器,@AppStorage ?

最佳答案

您所需要的只是符合 ArrayRawRepresentable使用来自 here 的扩展名:

extension Array: RawRepresentable where Element: Codable {
    public init?(rawValue: String) {
        guard let data = rawValue.data(using: .utf8),
              let result = try? JSONDecoder().decode([Element].self, from: data)
        else {
            return nil
        }
        self = result
    }

    public var rawValue: String {
        guard let data = try? JSONEncoder().encode(self),
              let result = String(data: data, encoding: .utf8)
        else {
            return "[]"
        }
        return result
    }
}
这是一个演示:
struct ContentView: View {
    @AppStorage("items") var items: [[String]] = [
        ["1", "2"],
        ["a", "b", "c"],
    ]

    var body: some View {
        VStack {
            Text("items: \(String(describing: items))")
            Button("Add item") {
                items[0].append(String(Int.random(in: 1...10)))
            }
        }
    }
}

关于arrays - 如何在 SwiftUI 的 @AppStorage 中存储嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63166706/

相关文章:

swift - 如何使用 SwiftUI 获取 ScrollView 的动态文本高度

c# - 从数组创建列表的效率

swift - 添加的 subview 位置稍微偏离 - 我怎样才能把它放回原位?

ios - 快速自动滚动到 TextView 控件的顶部

Swift 4.1 取消初始化和解除分配(容量 :) deprecated

ios - 有没有办法在 SwiftUI 中实现 "unbind"变量/对象

image - SwiftUI - 在列表/表单中显示图像,单元格周围没有边框

java - 更改数组 JAVA 中值的数量

javascript - 多维数组引用实例js

javascript - MongoDB:将数组转换为对象