在我的应用程序的“设置”视图中,我想让用户决定他们最喜欢的配色方案。但
ColorScheme
本身不能与UserDefaults
一起存储,因为它不是基本数据类型。所以我写了一个与 ColorScheme
相同的枚举仅用于存储目的。我希望做类似 extension ColorScheme: Int
的事情来使 ColorScheme
本身可存储以避免冗余枚举。我可以这样做,还是采取更明智的方式?
enum Appearance: Int {
case system
case light
case dark
var colorScheme: ColorScheme? {
switch self {
case .light: .light
case .dark: .dark
default: nil
}
}
}
@AppStorage("appearance") var appearance: Appearance = .system
Picker("Appearance", selection: $appearance) {
Text("System").tag(Appearance.system)
Divider()
Text("Light").tag(Setting.Appearance.light)
Text("Dark").tag(Setting.Appearance.dark)
}
RawRepresentable
/
Int
的
String
原始值可以用 @AppStorage
存储。您可以追溯性地使 ColorScheme
符合 RawRepresentable
。
extension ColorScheme: RawRepresentable {
public var rawValue: Int {
switch self {
case .light: 1
case .dark: 2
@unknown default: 0
}
}
public init?(rawValue: Int) {
switch rawValue {
case 1: self = .light
case 2: self = .dark
default: return nil
}
}
}
@AppStorage("appearance") var appearance: ColorScheme?
Picker("Appearance", selection: $appearance) {
Text("System").tag(ColorScheme?.none)
Divider()
Text("Light").tag(ColorScheme?(.light))
Text("Dark").tag(ColorScheme?(.dark))
}
也就是说,我仍然会考虑使用您自己的
Appearance
枚举,因为将来可能会添加更多案例到内置 ColorScheme
中。如果以某种方式将新的配色方案分配给 @AppStorage
属性,当您稍后尝试检索它时,您将获得 nil
。