gpt4 book ai didi

swift - 如何在 Swift 中实现管理 UserDefaults 的键值对的通用结构?

转载 作者:行者123 更新时间:2023-12-05 02:48:19 24 4
gpt4 key购买 nike

如何在 Swift 中实现一个管理 UserDefaults 映射的结构?现在我有一些不同类型的计算属性 a、b、c、d 和相应的键,如下所示:

enum UserDefaultsKeys {
a_key
b_key
...
}
var a: String {
get { UserDefaults.standard.string(forKey: UserDefaultsKeys.a_key.rawValue) }
set { UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.a_key.rawValue) }
}
var b: Int {
get { UserDefaults.standard.integer(forKey: UserDefaultsKeys.b_key.rawValue) }
set { UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.b_key.rawValue) }
}
...

我想要实现的是实现一个结构,该结构具有 String 类型的键和泛型类型的值。值获取函数应该 - 根据其类型 - 选择使用 UserDefaults.standard.stringUserDefaults.standard.integer 这样我就可以创建一个 DefaultsVar 与一些 key 和其他一切都为我自动管理。我到目前为止是这样的:

struct DefaultsVar<T> {
let key: String
var value: T {
get {
switch self {
case is String: return UserDefaults.standard.string(forKey: key) as! T
case is Int: return UserDefaults.standard.integer(forKey: key) as! T
default: return UserDefaults.standard.float(forKey: key) as! T
}
}
set { UserDefaults.standard.set(newValue, forKey: key) }
}
}

我收到以下错误:“从 DefaultsVar 转换为无关类型‘String’总是失败。我对 swift 完全陌生(并且对编程相对陌生)并且并不真正理解如何以正确的方式实现它 - 或者这是否是一种被认为是好的做法的方法。有人可以对此有所启发吗?

提前致谢!

最佳答案

你可以使用自定义

属性包装器:

@propertyWrapper
struct UserDefaultStorage<T: Codable> {
private let key: String
private let defaultValue: T

private let userDefaults: UserDefaults

init(key: String, default: T, store: UserDefaults = .standard) {
self.key = key
self.defaultValue = `default`
self.userDefaults = store
}

var wrappedValue: T {
get {
guard let data = userDefaults.data(forKey: key) else {
return defaultValue
}
let value = try? JSONDecoder().decode(T.self, from: data)
return value ?? defaultValue
}
set {
let data = try? JSONEncoder().encode(newValue)
userDefaults.set(data, forKey: key)
}
}
}

这个包装器可以将任何类型的可编码存储/恢复到/从用户默认值。

用法

@UserDefaultStorage(key: "myCustomKey", default: 0)
var myValue: Int

iOS 14

SwiftUI 有一个名为 @AppStorage 的类似包装器(仅适用于 iOS 14),它可以用作状态。使用它的好处是它可以直接用作State。但它需要 SwiftUI,并且只能在 iOS 14 上运行。

关于swift - 如何在 Swift 中实现管理 UserDefaults 的键值对的通用结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64557123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com