Тип значения enum со свойством @objc для отмены менеджера - быстро? - PullRequest
0 голосов
/ 15 января 2019

Как реализовать свойство 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)
    }
}
...