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】:

问题是enums 是值类型,所以当你在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。我已经相应地修改了你的MyTypeenum

【讨论】:

【参考方案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 枚举值不可设置的主要内容,如果未能解决你的问题,请参考以下文章

在swift初始化期间使用枚举设置属性

结构体的 Swift 枚举

Swift属性

Swift学习:构造过程

Swift4 初始化,文档代码。

Object.keysObject.getOwnPropertyNames区别