Требовать от разработчика протокола пометить функцию с помощью @objc - PullRequest
0 голосов
/ 12 сентября 2018

Я играю с UIMenuController, где я могу добавить пункт меню, который занимает #selector в его инициализации.

Теперь я могу захватить вызов в нескольких разных местах и ​​поэтому хочу написать протокол, чтобы убедиться, что каждое место, где я хочу получить действие из цепочки респондента, реализует правильную сигнатуру функции.

Моя проблема в том, как я требую, чтобы разработчики протокола добавили @objc к функции протокола? В противном случае он не будет вызван.

protocol PrintToConsoleProtocol {
    func printToConsole()
}

extension PDFView: PrintToConsoleProtocol {
    // PDFView conforms to PrintToConsoleProtocol without @objc!
    // So protocol does not make sure the implementor will be callable
    // despite having adopted it.
    @objc func printToConsole() {
        print("Printing to console.. from PDFView!")
    }
}

Код для добавления пункта меню:

let printToConsole = UIMenuItem(
    title: "Print To Console",
    action: #selector(PrintToConsoleProtocol.printToConsole)
)
UIMenuController.shared.menuItems = [printToConsole]

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете добавить @objc перед ключевым словом protocol, чтобы сделать его objc-протоколом, и принятие его интерпретирует все функции в протоколе, теперь присутствующем в реализаторе, как наличие @objc перед ним.

@objc protocol PrintToConsoleProtocol {
    func printToConsole()
}

extension PDFView: PrintToConsoleProtocol {
    func printToConsole() {
        print("Printing to console.. from PDFView!")
    }
}
...