在Swift 3中使用Selector

时间:2016-10-02 14:29:09

标签: ios swift swift3

我正在使用Swift 3编写我的iOS应用程序。

我有UIViewController扩展名,我必须检查控制器实例是否响应方法。下面是我尝试的代码。

extension UIViewController {
func myMethod() {
    if self.responds(to: #selector(someMethod)) {

    }
}}

这里responds(to:)方法抛出编译时错误

  

使用未解析的标识符" someMethod"。

我在另一篇文章中读到,我们必须在选择器参数中使用self,但即使这样也会引发一些错误。

3 个答案:

答案 0 :(得分:4)

创建需要someMethod()

的协议
protocol Respondable {
  func someMethod()
}

协议扩展仅影响UIViewController个实例

extension Respondable where Self : UIViewController {

  func myMethod() {
    someMethod()
  }
}

采用某些视图控制器的协议

class VC1 : UIViewController, Respondable {
  func someMethod() { print("Hello") }
}

class VC2 : UIViewController {}
class VC3 : UIViewController {}

现在调用扩展名

中的方法
let vc1 = VC1()
vc1.myMethod() // "Hello"

否则会出现编译错误:

let vc3 = VC3()
vc3.myMethod() // error: value of type 'VC3' has no member 'myMethod'

答案 1 :(得分:4)

一个简单的解决方法:

@objc protocol SomeMethodType {
    func someMethod()
}
extension UIViewController {
    func myMethod() {
        if self.responds(to: #selector(SomeMethodType.someMethod)) {
            //...
            self.perform(#selector(SomeMethodType.someMethod))
            // or
            (self as AnyObject).someMethod?()
            //...
        }
    }
}

多一点Swifty方式:

protocol SomeMethodType {
    func someMethod()
}
//For all classes implementing `someMethod()`.
extension MyViewController: SomeMethodType {}
//...
extension UIViewController {
    func myMethod() {
        if let someMethodSelf = self as? SomeMethodType {
            //...
            someMethodSelf.someMethod()
            //...
        }
    }
}

答案 2 :(得分:0)

Swift 4 answer:

If the selector is written as a string you won't get that error.

extension UIViewController {
    func myMethod() {
        if self.responds(to: "someMethod")) {

        }
    }
}

And then in the viewcontroller (dont forget the @objc):

@objc func someMethod() -> Void {}