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)
有没有一种简单的方法可以使用单行方法?
问题是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。