相关疑难解决方法(0)

协议扩展编译器错误中的Swift 2.2 #selector

我有一个协议扩展,它曾经在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,但是如果我这样做也要求我将它添加到实现它的类中,但是一旦我添加该类就不再符合协议,因为它不会好像在协议扩展中看到了实现.
我该如何正确实现?

protocols ios swift

25
推荐指数
3
解决办法
8892
查看次数

如何在协议扩展中使用#selector(myMethodName)?

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)

protocols swift2

9
推荐指数
1
解决办法
2499
查看次数

标签 统计

protocols ×2

ios ×1

swift ×1

swift2 ×1