Swift 枚举值不可设置

DrP*_*ill 4 setter enums swift computed-properties

我在我的应用程序中添加了一些语法糖,但我遇到了“不一致”。可能有很好的理由,但是有没有办法稍微清理一下实现。我这样做是为了提供一个地方来设置/获取一些属性。

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) }
    }

}
Run Code Online (Sandbox Code Playgroud)

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

if MyType.First.enabled {
    ........
}
Run Code Online (Sandbox Code Playgroud)

但我不能直接设置值:

MyType.First.enabled = true
Run Code Online (Sandbox Code Playgroud)

引发“无法设置属性,第一个不可分配”

但我可以逃脱

var type = MyType.First
type.enabled = true
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以使用单行方法?

Dáv*_*tor 5

问题是enums 是值类型,所以当你调用enabledon的 setter时MyType.First,你First也会发生变异。如果您没有明确地将值类型分配给可变变量,则它们被认为是不可变的。这就是为什么if MyType.First.enabled {...}不起作用,但是

var type = MyType.First
type.enabled = true
Run Code Online (Sandbox Code Playgroud)

确实有效。

如果您将 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) }
    }

}
Run Code Online (Sandbox Code Playgroud)

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