Swift 中带有选择器的协议扩展
Posted
技术标签:
【中文标题】Swift 中带有选择器的协议扩展【英文标题】:Protocol Extensions with Selectors in Swift 【发布时间】:2016-06-02 21:12:47 【问题描述】:我正在尝试通过添加 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")
在这一行:
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(Self.filterTapped(_:)))
我收到以下消息:
Argument of '#selector' refers to a method that is not exposed to Objective-C
我错过了什么?
我添加了@objc 关键字,但同样的问题。
更新 2:
现在,我的类中存在符合 FilterableView 协议的问题。 Xcode 抱怨我必须在我的类中实现 filterTapped 函数,即使我已经在协议扩展方法中提供了实现。
【问题讨论】:
您在协议中添加了错误的功能。你应该添加func filterTapped(recognizer :UITapGestureRecognizer)
是的,由于某种原因,您将 #selector(Self.filterTapped(_:))
更改为 #selector(filterTapped)
请不要更改代码的正确部分。
试试FilterableView.filterTapped(_:)
你解决过这个问题吗?
【参考方案1】:
重新编辑:您在协议中添加了错误的功能。添加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")
【讨论】:
为什么我什至需要在协议中添加任何内容?为什么它们不能只在协议扩展中。 @johndoe 协议扩展并未隐式暴露给 Objective-C。这就是为什么你需要在@objc
协议中声明它。
即使我在协议中公开了 filterTapped 并且即使我在协议扩展中实现了 filterTapped。如果我不实现 filterTapped 函数,具体类仍然会抱怨。以上是关于Swift 中带有选择器的协议扩展的主要内容,如果未能解决你的问题,请参考以下文章
单击 ImageView 并在 Swift/Xcode 中执行没有选择器的函数
Swift - 带有Objective-C选择器'*'的方法'*()'与具有相同Objective-C选择器的超类'UIView'中的'*'的getter冲突