Swift 枚举值不可设置
Posted
技术标签:
【中文标题】Swift 枚举值不可设置【英文标题】:Swift enum values not settable 【发布时间】:2019-07-08 12:33:21 【问题描述】:我正在向我的应用程序添加一些语法糖,但我遇到了“不一致”。这可能是有充分理由的,但是有没有办法稍微清理一下实现。 我这样做是为了提供一个地方来设置/获取一些属性。
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
引发'无法设置属性,First 不可分配'
但我可以逃脱
var type = MyType.First
type.enabled = true
有没有简单的使用单行法的方法?
【问题讨论】:
你在找nonmutating set
,我不知道是否值得写答案,因为你只需要在set
关键字之前添加nonmutating
关键字。如果有人可以将其扩展为完整的答案,请这样做。
【参考方案1】:
问题是enum
s 是值类型,所以当你在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
case 的 Swift 命名约定是 lowerCamelCase,因为它们本身不是类型,只有类型应该是 UpperCamelCase。我已经相应地修改了你的MyType
enum
。
【讨论】:
【参考方案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)
【讨论】:
以上是关于Swift 枚举值不可设置的主要内容,如果未能解决你的问题,请参考以下文章