无法分配给属性:<Enum:case>不可设置

EvG*_*yin 2 enums swift

例如,我们有简单的枚举

public enum CXActionSheetToolBarButtonItem {
    case cancel
    case done
    case now

    private static var titles: [CXActionSheetToolBarButtonItem: String] = [
        .cancel: "Cancel",
        .done: "Done",
        .now: "Now",
    ]

    public var title: String  {
        get { return CXActionSheetToolBarButtonItem.titles[self] ?? String(describing: self) }
        // what am I want to do
        set(value) { CXActionSheetToolBarButtonItem.titles[self] = value }
    }

    // what am I forced to do
    public static func setTitle(_ title: String, for item: CXActionSheetToolBarButtonItem) {
        CXActionSheetToolBarButtonItem.titles[item] = title
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能设置这样的新标题

CXActionSheetToolBarButtonItem.cancel.title = "asd"
Run Code Online (Sandbox Code Playgroud)

编译器响应错误 - 无法分配属性:'cancel'不可设置,但我可以用函数设置标题

CXActionSheetToolBarButtonItem.setTitle("asd", for: .cancel)
Run Code Online (Sandbox Code Playgroud)

我应该如何改变我的var作为可设置? .cancel.title = "asd"

Ale*_*ica 8

使用枚举似乎是不合适的,但我会以面值来解决这个问题.您需要将setter标记为nonmutating,以便可以在var枚举的非实例上调用它:

public enum CXActionSheetToolBarButtonItem {

    // ...

    public var title: String  {
        get { return CXActionSheetToolBarButtonItem.titles[self] ?? String(describing: self) }
        nonmutating set(value) { CXActionSheetToolBarButtonItem.titles[self] = value }
    }
}

CXActionSheetToolBarButtonItem.cancel.title = "foo" // Works... but why would you want this?!
Run Code Online (Sandbox Code Playgroud)