【问题标题】:Swift enum values not settableSwift 枚举值不可设置
【发布时间】: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关键字。如果有人可以将其扩展为完整的答案,请这样做。

标签: swift enums setter computed-properties


【解决方案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) }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多