Swift枚举值不可设置

时间:2019-02-14 13:05:36

标签: swift enums setter computed-properties

我在我的应用程序中添加了一些语法糖,但遇到了“不一致”现象。可能有充分的理由,但是有一些方法可以清除实现。 我这样做是为了提供一个设置/获取某些属性的地方。

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

有使用单行方法的简单方法吗?

2 个答案:

答案 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) }
    }
}