Swift 枚举值不可设置
Swift enum values not settable
我正在向我的应用程序添加一些语法糖,然后我遇到了 'inconsistency'。这可能有充分的理由,但有没有办法稍微清理一下实现。
我这样做是为了为 set/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
引出'cannot set property, First is not assignable'
但我可以逃脱
var type = MyType.First
type.enabled = true
有没有简单的单线法使用方法?
通过将 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) }
}
}
问题在于 enum
是值类型,因此当您在 MyType.First
上调用 enabled
的 setter 时,您将 First
变异为出色地。如果您不显式地将值类型分配给可变变量,则它们被认为是不可变的。这就是为什么 if MyType.First.enabled {...}
不起作用,但
var type = MyType.First
type.enabled = true
有效。
如果您将 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) }
}
}
P.S.: enum
案例的 Swift 命名约定是 lowerCamelCase,因为它们本身不是类型,只有类型应该是 UpperCamelCase。我已经相应地修改了你的 MyType
enum
。
我正在向我的应用程序添加一些语法糖,然后我遇到了 'inconsistency'。这可能有充分的理由,但有没有办法稍微清理一下实现。 我这样做是为了为 set/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
引出'cannot set property, First is not assignable'
但我可以逃脱
var type = MyType.First
type.enabled = true
有没有简单的单线法使用方法?
通过将 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) }
}
}
问题在于 enum
是值类型,因此当您在 MyType.First
上调用 enabled
的 setter 时,您将 First
变异为出色地。如果您不显式地将值类型分配给可变变量,则它们被认为是不可变的。这就是为什么 if MyType.First.enabled {...}
不起作用,但
var type = MyType.First
type.enabled = true
有效。
如果您将 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) }
}
}
P.S.: enum
案例的 Swift 命名约定是 lowerCamelCase,因为它们本身不是类型,只有类型应该是 UpperCamelCase。我已经相应地修改了你的 MyType
enum
。