`#selector` 的参数不引用初始化程序或方法
Argument of `#selector` does not refer to an initializer or method
我正在尝试在后台执行协议扩展方法:
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() {
...
}
}
我怎样才能做到这一点?
试试这个:
#selector(DataRetrievalOperations.retrieveCategories)
在 #selector(...)
符号中省略 class(或协议)名称,Swift 假定封闭的 class,它可能是 ViewController,我猜猜
还有一个问题:
似乎 Swift 无法在协议扩展中使用默认实现来实现 @objc 协议方法。
(我想我听说过一些这方面的事情,但我暂时找不到任何文章。)
您可能需要在自己的 class 扩展中实现它,或者寻找其他方式。
extension CategoriesViewController {
func retrieveCategories() {
//...
}
}
我需要补充一点,这将解决第一个问题,#selector(retrieveCategories)
会起作用。
您不能在协议扩展中添加 @Objc
方法。您需要扩展继承 NSObject 和该协议的 Class 并在其中添加 objc
函数,如下所示:
@objc protocol DataRetrievalOperations {
optional func retrieveCategories()
}
class aClass: NSObject, DataRetrievalOperations {
func method() {
performSelectorInBackground(#selector(retrieveCategories), withObject: nil)
}
}
extension aClass {
@objc func retrieveCategories(){
}
}
这会起作用。
我正在尝试在后台执行协议扩展方法:
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() {
...
}
}
我怎样才能做到这一点?
试试这个:
#selector(DataRetrievalOperations.retrieveCategories)
在 #selector(...)
符号中省略 class(或协议)名称,Swift 假定封闭的 class,它可能是 ViewController,我猜猜
还有一个问题: 似乎 Swift 无法在协议扩展中使用默认实现来实现 @objc 协议方法。 (我想我听说过一些这方面的事情,但我暂时找不到任何文章。)
您可能需要在自己的 class 扩展中实现它,或者寻找其他方式。
extension CategoriesViewController {
func retrieveCategories() {
//...
}
}
我需要补充一点,这将解决第一个问题,#selector(retrieveCategories)
会起作用。
您不能在协议扩展中添加 @Objc
方法。您需要扩展继承 NSObject 和该协议的 Class 并在其中添加 objc
函数,如下所示:
@objc protocol DataRetrievalOperations {
optional func retrieveCategories()
}
class aClass: NSObject, DataRetrievalOperations {
func method() {
performSelectorInBackground(#selector(retrieveCategories), withObject: nil)
}
}
extension aClass {
@objc func retrieveCategories(){
}
}
这会起作用。