需要协议实现者使用@objc标记功能

时间:2018-09-12 20:11:48

标签: swift swift-protocols

我正在玩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 :(得分:0)

您可以在@objc关键字之前添加protocol,使其成为objc协议,采用它可以将实现程序中存在的协议中的所有功能解释为在其之前具有@objc

@objc protocol PrintToConsoleProtocol {
    func printToConsole()
}

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