当前位置 : 主页 > 手机开发 > 其它 >

Swift枚举值无法设置

来源:互联网 收集:自由互联 发布时间:2021-06-11
我在我的应用程序中添加了一些语法糖,我遇到了“不一致”.它可能是有充分理由的,但有没有办法清理实现. 我这样做是为了提供一个地方来设置/获取一些属性. enum MyType: String { case U
我在我的应用程序中添加了一些语法糖,我遇到了“不一致”.它可能是有充分理由的,但有没有办法清理实现.
我这样做是为了提供一个地方来设置/获取一些属性.

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

有一种简单的方法来使用单行方法吗?

问题是枚举是值类型,所以当你在MyType.First上调用启用的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) }
    }

}

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

网友评论