Swift中选择器的协议扩展

joh*_*doe 10 ios swift

我试图通过添加registerGestureRecognizers函数来扩展Swift中的协议.这是完整的实现.

FilterableView由从UIImageView继承的类使用.

import UIKit

protocol FilterableView : class  {

    var name :String { get }
    var view :UIImageView { get } 

    func applyFilter(originalImage :UIImage) -> UIImage
}

extension FilterableView {

    func registerGestureRecognizers() {

        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(Self.filterTapped(_:)))

    }

    func filterTapped(recognizer :UITapGestureRecognizer) {
            print("filter Tapped")
    }

}
Run Code Online (Sandbox Code Playgroud)

在这一行:

 let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(Self.filterTapped(_:)))
Run Code Online (Sandbox Code Playgroud)

我收到以下消息:

Argument of '#selector' refers to a method that is not exposed to Objective-C
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

我添加了@objc关键字,但问题相同.

在此输入图像描述

更新2:

现在,我在符合FilterableView协议的类中遇到问题.Xcode抱怨我必须在我的类中实现filterTapped函数,即使我已经在协议扩展方法中提供了实现.

JAL*_*JAL 0

重新编辑:您在协议中添加了错误的函数。加func filterTapped(recognizer: UITapGestureRecognizer)func registerGestureRecognizers()

@objc protocol FilterableView: class  {

    var name: String { get }
    var view: UIImageView { get }

    func applyFilter(originalImage: UIImage) -> UIImage
    func filterTapped(recognizer: UITapGestureRecognizer)
}

extension FilterableView {

    func registerGestureRecognizers() {

        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(Self.filterTapped(_:)))

    }

    func filterTapped(recognizer :UITapGestureRecognizer) {
        print("filter Tapped")
    }

}
Run Code Online (Sandbox Code Playgroud)

  • @johndoe 协议扩展不会隐式暴露给 Objective-C。这就是为什么你需要在`@objc`协议中声明它。 (2认同)