gpt4 book ai didi

ios - 实现另一个 @objc 协议(protocol)的 Swift 协议(protocol)

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:21:53 32 4
gpt4 key购买 nike

使用 Swift 4,我正在尝试编写一个自定义协议(protocol),它提供对 @objc 协议(protocol)的一致性。

一些代码

更具体地说,我有一个自定义协议(protocol) Searchable,它提供了 UIKit 协议(protocol) UISearchBarDelegate 的简单实现,只需要实现一个回调来处理搜索过滤器更改。

@objc protocol Searchable: class, UISearchBarDelegate {
@objc func searchFilterChanged(_: String?)
}

我在协议(protocol)扩展中提供委托(delegate)实现:

extension Searchable {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
searchFilterChanged(searchText)
}
// .. and some other delegate methods
}

最后,在另一个扩展中,我创建并安装了搜索栏(installSearchBar 必须从具体 View Controller 的 viewDidLoad 调用):

extension Searchable where Self: UITableViewController {
func installSearchBar() {
let searchBar = UISearchBar()
searchBar.delegate = self
tableView?.tableHeaderView = searchBar
}
}

问题

不幸的是,当用户在搜索栏中输入文本时,UISearchBarDelegate 的委托(delegate)方法不会被调用。编译器用这条消息警告我:

Non-'@objc' method 'searchBar(_:textDidChange:)' does not satisfy optional requirement of '@objc' protocol 'UISearchBarDelegate'

但是,我无法将 @objc 添加到方法中,因为这会导致以下编译器错误:

@objc can only be used with members of classes, @objc protocols, and concrete extensions of classes

问题

所以现在我的问题是:是否可以在 Swift 中实现所需的行为,或者是否不可能在另一个协议(protocol)中实现对 @objc 协议(protocol)的一致性?

注1:我知道这可以使用子类来实现;我还在寻找 POP 版本。

注意 2:我知道 UISearchController 也有助于简化搜索的实现;我不能使用这个类,因为在我的实际代码中,我有一个更复杂的过滤器 View 和其他控件——这就是我使用裸 UISearchBar 的原因。

最佳答案

这是因为 Obj-C 运行时使用动态分派(dispatch)(动态查找/消息传递)来符合对象以了解它是否确认所需的方法并调用它。

Swift 协议(protocol)扩展默认使用静态调度。从某种意义上说,当 UISearchBarDelegate 将一条消息传递给符合此协议(protocol)的类时,它找不到扩展方法,因为这对协议(protocol)来说是静态的。因此,您的实现既不会被运行时检测到,也不会起作用。

这是一个很深的话题。我不希望你用我简单的段落就清楚了。但是,当 Swift 协议(protocol)扩展是新的(试图概括 UITableViewDelegate 和 DataSource)时,我尝试了这个,但都是徒劳的。我必须研究原因,我可以根据我的经验和研究告诉你,这与 Objc 消息传递有关,依赖于动态调度和静态调度的协议(protocol)扩展。

关于ios - 实现另一个 @objc 协议(protocol)的 Swift 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47109329/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com