是否可以扩展现有枚举来确认 Swift 中的 Int?

问题描述 投票:0回答:1

在我的应用程序的“设置”视图中,我想让用户决定他们最喜欢的配色方案。但

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)
}
swift macos enums userdefaults
1个回答
0
投票
带有

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(Optional<ColorScheme>.none)
    Divider()
    Text("Light").tag(Optional(ColorScheme.light))
    Text("Dark").tag(Optional(ColorScheme.dark))
}

也就是说,我仍然会考虑使用您自己的

Appearance
枚举,因为将来可能会添加更多案例到
ColorScheme
中。如果以某种方式将新的配色方案分配给
@AppStorage
属性,当您稍后尝试检索它时,您将获得
nil

© www.soinside.com 2019 - 2024. All rights reserved.