`#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(){

    }
}

这会起作用。