Swift枚举值不可设置

Swift枚举值不可设置,swift,enums,setter,computed-properties,Swift,Enums,Setter,Computed Properties,我在我的应用程序中添加了一些语法糖,我遇到了一个“不一致性”。这可能有很好的理由,但有没有办法稍微清理一下实现。 我这样做是为了提供一个单独的位置来设置/获取一些属性 enum MyType: String { case Unknown, First, Second var enabled: Bool { set { UserDefaults.standard.set(newValue, forKey: self.rawValue) } 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
引出“无法设置属性,第一个属性不可赋值”

但我可以侥幸逃脱

var type = MyType.First
type.enabled = true

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

通过向
set
方法添加
nonmutating
关键字,您告诉编译器
set
方法不会修改封闭类型,在这种情况下,即enum
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
s是值类型,因此当您在
MyType.First
上调用
enabled
的setter时,您也会对
First
进行变异。如果不显式地将值类型分配给可变变量,则认为它们是不可变的。这就是为什么
如果MyType.First.enabled{…}
不起作用,但是

var type = MyType.First
type.enabled = true
确实有效

如果将setter标记为
非置换
,问题就解决了,因为编译器现在知道,在调用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) }
    }

}

注意:
enum
案例的Swift命名约定是小写的,因为它们本身不是类型,只有类型应该是大写的。我已经相应地修改了您的
MyType
enum

您正在寻找
非转换集
,我不知道是否值得写这个答案,因为您只需要在
关键字之前添加
非转换
关键字。如果有人能把这个问题扩展成完整的答案,请这样做。