LocalStorage

一个 Swift 属性包装器,允许用户自动在 UserDefaults 中保存和加载对象。它是 AppStorage 的扩展。

通过 Swift Package Manager 安装

要求

问题

import SwiftUI

struct Item {
    var i: Int
}

@AppStorage("item") var item = Item(i: Int) // <-- This doesn't work, because AppStorage/UserDefaults doesn't support objects and arrays

解决方案

简单:像使用 AppStorage 一样使用 LocalStorage。该项必须符合 Codable 协议。您可以将其与对象和数组一起使用。

import LocalStorage

struct Item {
    var i: Int
}

@LocalStorage("item") var item = Item(i: Int)

SwiftUI 演示

import SwiftUI
import LocalStorage

struct Item: Codable, Identifiable, Equatable {
    var id = UUID()
    var int: Int
}

struct ContentView: View {
    
    @LocalStorage("items") var items = [Item]()
    
    var body: some View {
        NavigationStack {
            List {
                ForEach(items) { item in
                    Text("\(item.int)")
                }
                .onDelete { indexSet in
                    items.remove(atOffsets: indexSet)
                }
            }
            Button("Add Object") {
                items.append(Item(i: Int.random(in: 1...100)))
            }
            .navigationTitle("LocalStorage Demo")
        }
        .animation(.easeInOut, value: items)
    }
}

数据将永久保存在设备上。

好的,但它实际上是如何工作的?

简单:当用户向该值写入内容时,属性包装器会将该数据转换为 JSON,并将其作为二进制数据保存在 UserDefault 中指定的键下。如果用户从该值读取数据,则数据将从 UserDefaults 中获取,并将 JSON 转换为 Swift 对象或数组。请注意,此软件包相当新,可能存在一些错误。如果您发现任何错误,请报告它们以进一步改进软件包。现在是时候尝试使用了。 :D