我正在使用Swift 3编写我的iOS应用程序。
我有UIViewController
扩展名,我必须检查控制器实例是否响应方法。下面是我尝试的代码。
extension UIViewController {
func myMethod() {
if self.responds(to: #selector(someMethod)) {
}
}}
这里responds(to:)
方法抛出编译时错误
使用未解析的标识符" someMethod"。
我在另一篇文章中读到,我们必须在选择器参数中使用self
,但即使这样也会引发一些错误。
答案 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 {}