我试图在后台执行协议扩展方法:
performSelectorInBackground(#selector(retrieveCategories()), withObject: nil)
但是我收到以下错误消息:
Argument of `#selector` does not refer to an initializer or method
这是我的协议声明:
@objc protocol DataRetrievalOperations {
optional func retrieveCategories()
...
}
我的扩展名:
extension DataRetrievalOperations {
func retrieveCategories() {
...
}
}
我怎样才能做到这一点?
答案 0 :(得分:4)
试试这个:
#selector(DataRetrievalOperations.retrieveCategories)
在#selector(...)
表示法中省略了类(或协议)名称,Swift假设了封闭类,我想这可能是一个ViewController。
还有一个问题: 似乎Swift无法在协议扩展中使用默认实现来实现@objc协议方法。 (我想我已经听说过这个,但我现在找不到任何文章。)
您可能需要在自己的课程扩展中实现它,或者找另一种方式。
extension CategoriesViewController {
func retrieveCategories() {
//...
}
}
我需要补充一点,这将解决第一个问题,#selector(retrieveCategories)
将起作用。
答案 1 :(得分:3)
您无法在协议扩展中添加@Objc
方法。您需要扩展继承NSObject和该协议的类,并在其中添加objc
函数,如下所示:
@objc protocol DataRetrievalOperations {
optional func retrieveCategories()
}
class aClass: NSObject, DataRetrievalOperations {
func method() {
performSelectorInBackground(#selector(retrieveCategories), withObject: nil)
}
}
extension aClass {
@objc func retrieveCategories(){
}
}
这样可行。