首页 > 解决方案 > 要求协议实现者用@objc 标记函数

问题描述

我正在玩UIMenuController我可以添加一个菜单项的地方,该菜单项#selector在其初始化中采用 a 。

现在我可能会在几个不同的地方抓取调用,因此想编写一个协议来确保我想从响应链中抓取动作的每个地方都实现正确的函数签名。

我的问题是,我如何要求协议实现者添加@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]

标签: swiftswift-protocols

解决方案


您可以在 -keyword@objc之前添加protocol以使其成为 objc 协议,并采用它将现在存在于实现者中的协议中的所有功能解释为@objc在它之前具有。

@objc protocol PrintToConsoleProtocol {
    func printToConsole()
}

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

推荐阅读