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
方法不会修改封闭类型,在这种情况下,即enumMyType
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
。您正在寻找非转换集
,我不知道是否值得写这个答案,因为您只需要在集
关键字之前添加非转换
关键字。如果有人能把这个问题扩展成完整的答案,请这样做。