我在我的应用程序中添加了一些语法糖,我遇到了“不一致”.它可能是有充分理由的,但有没有办法清理实现. 我这样做是为了提供一个地方来设置/获取一些属性. 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枚举.