我有一个协议扩展,它曾经在swift 2.2之前完美地工作.
现在我有一个警告,告诉我使用新的#selector,但如果我添加它
没有使用Objective-C Selector声明的方法.
我尝试在这几行代码中重现这个问题,可以很容易地复制并粘贴到游乐场
protocol Tappable {
func addTapGestureRecognizer()
func tapGestureDetected(gesture:UITapGestureRecognizer)
}
extension Tappable where Self: UIView {
func addTapGestureRecognizer() {
let gesture = UITapGestureRecognizer(target: self, action:#selector(Tappable.tapGestureDetected(_:)))
addGestureRecognizer(gesture)
}
}
class TapView: UIView, Tappable {
func tapGestureDetected(gesture:UITapGestureRecognizer) {
print("Tapped")
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个建议在协议中附加到该方法@objc,但是如果我这样做也要求我将它添加到实现它的类中,但是一旦我添加该类就不再符合协议,因为它不会好像在协议扩展中看到了实现.
我该如何正确实现?
protocol LazyUpdateable {
func waitToDoStuff()
func myMethodName()
}
extension LazyUpdateable where Self: NSObject {
func waitToDoStuff() {
self.performSelector(#selector(myMethodName), withObject: nil, afterDelay: 1.5)
}
func myMethodName() {
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个更新,我得到了错误Argument of #selector refers to a method that is not exposed to objective c,但是如果我继续使用旧版本,Selector("myMethodName")我会收到警告,要求更改为更好的方法.#selector()在这种情况下是否可以使用?它不适用于设置@objc我的协议,我已经尝试过了.
这是一个你可以尝试的游乐场,它表明它不适用于设置 @objc
import Foundation
import UIKit
import XCPlayground
@objc protocol LazyUpdatable {
optional func waitToDoStuff()
optional func myMethodName()
}
extension LazyUpdatable where Self: UIViewController {
func waitToDoStuff() {
self.performSelector(#selector(myMethodName), withObject: …Run Code Online (Sandbox Code Playgroud)