Как использовать #selector в Swift 2.2 для первого респондента без класса?

Я хочу отправить doSomething к firstResponder, который может быть любым из нескольких объектов.

menuItem = NSMenuItem(title: "Do Something!",
                      action: Selector("doSomething"),
                      keyEquivalent: "")

Я использовал Selector("doSomething") до Swift 2.2. Как мне это сделать сейчас?

2 ответа

Решение

Создать протокол с помощью селектора doSomething и имейте все свои объекты, которые могут быть первыми респондентами, соответствовать этому. Затем реализуйте селектор для ваших классов.

@objc protocol MyProtocol {
    func myCoolFuncThatManyObjectsRespondTo()
}

extension NSObject: MyProtocol {
    func myCoolFuncThatManyObjectsRespondTo() {
        print("Sup?")
    }
}

let menuItem = NSMenuItem(title: "Do Something!", action: #selector(MyProtocol.myCoolFuncThatManyObjectsRespondTo), keyEquivalent: "")
#selector({classname}.{methodname}{signature})

func doSomething() {}

  #selector(MyClass.doSomething)

func doSomething(arg: String) {}

  #selector(MyClass.doSomething(_:))

func doSomething(arg: String, withSomething something: Int) {}

  #selector(MyClass.doSomething(_:withSomething:))

Обратите внимание, что выбранный метод должен быть соединен с Objective-C, так что либо MyClass должен продлить NSObject или добавить @objc аннотация к методу.

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