Swift 枚举值不可设置

Swift enum values not settable

我正在向我的应用程序添加一些语法糖,然后我遇到了 'inconsistency'。这可能有充分的理由,但有没有办法稍微清理一下实现。 我这样做是为了为 set/get 某些属性提供一个位置。

enum MyType: String {
    case Unknown, First, Second

    var enabled: Bool {
        set { UserDefaults.standard.set(newValue, forKey: self.rawValue) }
        get { return UserDefaults.standard.bool(forKey: self.rawValue) }
    }

}

现在我可以使用枚举值来获取默认值

if MyType.First.enabled {
    ........
}

但是我不能直接设置值:

MyType.First.enabled = true

引出'cannot set property, First is not assignable'

但我可以逃脱

var type = MyType.First
type.enabled = true

有没有简单的单线法使用方法?

通过将 nonmutating 关键字添加到 set 方法,您告诉编译器 set 方法 不会 修改封闭类型,在这种情况下是枚举 MyType

enum MyType: String {
    case Unknown, First, Second

    var enabled: Bool {
       nonmutating set { UserDefaults.standard.set(newValue, forKey: self.rawValue) }
       get { return UserDefaults.standard.bool(forKey: self.rawValue) }
    }
}

问题在于 enum 是值类型,因此当您在 MyType.First 上调用 enabled 的 setter 时,您将 First 变异为出色地。如果您不显式地将值类型分配给可变变量,则它们被认为是不可变的。这就是为什么 if MyType.First.enabled {...} 不起作用,但

var type = MyType.First
type.enabled = true

有效。

如果您将 setter 标记为 nonmutating,问题将得到解决,因为编译器现在知道您在调用 setter 时不会改变值类型它的 属性.

enum MyType: String {
    case unknown, first, second

    var enabled: Bool {
        nonmutating set { UserDefaults.standard.set(newValue, forKey: self.rawValue) }
        get { return UserDefaults.standard.bool(forKey: self.rawValue) }
    }

}

P.S.: enum 案例的 Swift 命名约定是 lowerCamelCase,因为它们本身不是类型,只有类型应该是 UpperCamelCase。我已经相应地修改了你的 MyType enum