【发布时间】:2019-06-15 10:36:44
【问题描述】:
我有一个设置结构,它在UserDefaults 中存储了数百个设置。
代码如下:
struct Settings {
public enum key: String
{
case mySetting = "mySetting"
...
...
}
public var mySetting: Bool {
get {
return UserDefaults.standard.bool(forKey: key.mySetting.rawValue)
}
set (newValue) {
return UserDefaults.standard.set(newValue, forKey: key.mySetting.rawValue)
}
}
....
....
}
我想扩展它。我想获取在对等设备上运行的应用程序的另一个实例的设置并将其存储为Dictionary。 mySetting 他们必须从 dictionary 而不是 UserDefaults 返回 key.mySetting key 的值。但是如果没有连接对等设备,那么它应该返回UserDefaults中的值。
我想知道如何扩展 Settings 结构(或者如果需要将其更改为 class)来实现此功能,而无需在代码中的数百个位置放置“if then else”。
我在数百个地方这样做:
var settings = Settings()
或者
let settings = Settings()
最好有一些自动提取正确设置字典来查找的结构。
编辑:正如我所说,并非所有返回类型都可以简单,这使工作变得更加困难。一些返回类型是枚举、一些字典、一些数组。正如一些人建议使用一种返回 Any? 的统一方法,例如,在我使用返回类型的地方,这项工作会更加困难。
public var microphone: Microphone {
get {
if let mic = Microphone.init(rawValue: UserDefaults.standard.integer(forKey: key.microphone.rawValue)) {
return mic
} else {
return .auto
}
}
set (newValue) {
UserDefaults.standard.set(newValue.rawValue, forKey: key.microphone.rawValue)
}
}
【问题讨论】:
-
你能添加到你的设置结构的代码吗?
-
代码只是设置的,我刚刚更新了。
-
您的代码的问题是默认值中的每个设置都通过不同的方法;例如,
public var mySetting仅处理mySetting默认键。您应该通过 one 方法传递所有内容。 -
@matt 问题不是所有设置变量/方法都具有相同的返回类型。一些返回类型是枚举,我在这些方法中做了艰苦的工作。一种方法怎么能解决所有问题?如果我有一个返回 Any? 的方法,那么在我使用该方法的地方,我将需要重做努力。上面的示例(代码已编辑)。
-
这就是泛型存在的原因。
标签: ios swift userdefaults