我在我的应用程序中添加了一些语法糖,但遇到了“不一致”现象。可能有充分的理由,但是有一些方法可以清除实现。 我这样做是为了提供一个设置/获取某些属性的地方。
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
有使用单行方法的简单方法吗?
答案 0 :(得分:3)
问题在于enum
是值类型,因此当您在enabled
上调用MyType.First
的设置方法时,也会对First
进行突变。如果未将值类型显式分配给可变变量,则将它们视为不可变的。这就是if MyType.First.enabled {...}
不起作用,但
var type = MyType.First
type.enabled = true
确实。
如果将设置器标记为nonmutating
,则此问题已解决,因为编译器现在将不再需要在对设置器的属性进行调用时更改值类型。
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。:enum
案例的Swift命名约定是lowerCamelCase,因为它们本身不是类型,而只有类型应该是UpperCamelCase。我已相应地修改了您的MyType
enum
。
答案 1 :(得分:2)
通过将nonmutating
关键字添加到set
方法中,您将告诉编译器set
方法将不修改封闭类型,即在这种情况下,枚举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) }
}
}