例如,我们有简单的枚举
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"
使用枚举似乎是不合适的,但我会以面值来解决这个问题.您需要将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)