Тип значения enum со свойством @objc для отмены менеджера - быстро?
Как реализовать свойство swift enum, чтобы правильно обрабатывать отмену?
В настоящее время я использую (undoManager?.prepare(withInvocationTarget: self) as AnyObject).setValue(_scaling.rawValue, forKey: "scaling")
но он терпит неудачу на значении 0. setnilvalueforKey
не вызывается, но setValue(_ value: Any?, forKey key: String)
вызывается, но время от времени происходит сбой.
Как сделать это быстрее?
@objc
enum ImageScaling : Int {
case FitInSquare
case None
}
private var _scaling : ImageScaling = .FitInSquare
@objc dynamic var scaling : ImageScaling {
get {
return _scaling
}
set(newValue) {
guard (_scaling != newValue) else { return }
//doesn't work
//undoManager?.registerUndo(withTarget: self, selector: #selector(setter: Picture.scaling), object: _scaling)
//setnilvalueforKey if 0, doesn't work for 0 in swift
(undoManager?.prepare(withInvocationTarget: self) as AnyObject).setValue(_scaling.rawValue, forKey: "scaling")
undoManager?.setActionName("Change Scaling")
document?.beginChanges()
_scaling = newValue
document?.endChanges()
}
}
override func setValue(_ value: Any?, forKey key: String) {
if (key == "scaling") {
if (value as? Int == 0) {
scaling = .FitInSquare
} else {
super.setValue(value, forKey: key)
}
} else {
super.setValue(value, forKey: key)
}
}
//doesn't get called
override func setNilValueForKey(_ key: String) {
if (key == "scaling") {
scaling = .FitInSquare
} else {
super.setNilValueForKey(key)
}
}