如何向 NSTableViewDelegate 协议添加方法?

How to add methods to NSTableViewDelegate protocol?

我想用一些自定义方法扩展 NSTableViewDelegate 协议。例如,我希望我的自定义 NSTableView subclass 通知代理某些特定事件。是否可以不创建另一个协议而是向现有协议添加自定义方法?这里最好的方法是什么?

我尝试编写和扩展 NSTableViewDelegate,方法被调用,但在这个扩展中我无法访问委托 class(我的子 class NSViewController)。这有点破坏了整个想法,因为控制器需要以其特定方式响应事件。

那么:如何向 NSTableViewDelegate 协议添加方法并在委托中提供实现 class?

抱歉冗长:)

示例代码(在项目中略有不同,但思路是一样的):

extension NSTableViewDelegate {
    func didBecomeFirstResponder(_ tableView: NSTableView) {
        isTableViewFirstResponder = true //warning: Use of unresolved identifier 'isTableViewFirstResponder'
    }

    func didResignFirstResponder(_ tableView: NSTableView) {
        isTableViewFirstResponder = false   //warning: Use of unresolved identifier 'isTableViewFirstResponder'
    }
}

isTableViewFirstResponder 是代表 class 的 属性。 Swift 就是不知道去哪里找。如何在声明 isTableViewFirstResponder 的地方指定 class?

您正在扩展 NSTableViewDelegate 协议,因此只能看到 NSTableViewDelegate 实现中存在的内容。 isTableViewFirstResponderNSTableViewDelegate 的实现中不存在,因此扩展不知道。

Afaik 不可能将存储的 属性 添加到扩展中,因此我认为您必须引入一个额外的 Protcol,这在我看来也是有意义的。因为它不是代表责任,而是响应者责任:

protocol NSTableViewResponder {
    var isTableViewFirstResponder: Bool {get set}
}

extension NSTableViewResponder {
    mutating func didBecomeFirstResponder(_ tableView: NSTableView) {
        isTableViewFirstResponder = true
    }

    mutating func didResignFirstResponder(_ tableView: NSTableView) {
        isTableViewFirstResponder = false
    }
}

可以向该协议添加方法。但是实现将驻留在扩展中,没有明显的方法来实现符合协议的 class 中的其他方法。