Как обновить NSResponder селектор в Swift 2.2

Я реализую протокол NSControlTextEditingDelegate, и я не знаю, какой класс / протокол я должен соответствовать, например, commandSelector. #selector(WhichClass.moveUp(_:)), чтобы равенство прошло.

В настоящее время все в порядке с Swift 2.1:

func control(control: NSControl, textView: NSTextView, doCommandBySelector commandSelector: Selector) -> Bool {

    var goUp = false
    var goDown = false

        if (commandSelector == Selector("moveUp:") ||
        commandSelector == Selector("moveBackward:") ||
        commandSelector == Selector("moveUpAndModifySelection:") ||
        commandSelector == Selector("moveParagraphBackwardAndModifySelection:")
            )

        {
            goUp = true
        }
        if (commandSelector == Selector("moveDown:") ||
        commandSelector == Selector("moveForward:") ||
        commandSelector == Selector("moveDownAndModifySelection:") ||
        commandSelector == Selector("moveParagraphForwardAndModifySelection:")
            ) {
            goDown = true

        }
//...
}

1 ответ

Решение

Попробуй это:

if (commandSelector == #selector(NSResponder.moveUp) ||

Вы можете написать это следующим образом, если вы предпочитаете:

if (commandSelector == #selector(NSResponder.moveUp(_:)) ||

На самом деле, генерируется Selector экземпляр из #selector не содержит информацию о классе. Итак, вы просто найдете любой класс, определяющий один и тот же метод с той же сигнатурой.


И если вы не можете найти какой-либо класс, вы можете определить его в своем собственном протоколе и использовать имя протокола.

@objc protocol MyProtocol {
    func moveUp(_:AnyObject)
    //...
}

И использовать его в #selector:

if (commandSelector == #selector(MyProtocol.moveUp(_:)) ||

Последний должен быть последним способом, но на самом деле он работает.

Другие вопросы по тегам