一尘不染

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

swift

我有一个协议扩展,它过去在swift 2.2之前可以完美地工作。

现在我有一个警告,告诉我使用新的#selector,但是如果我添加它

没有使用Objective-C选择器声明任何方法。

我尝试通过以下几行代码重现该问题,可以轻松将其复制并粘贴到操场上

      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")
        }
    }

还有一个建议在协议中附加到该方法@objc,但是如果我这样做,它还会要求我将其添加到实现该方法的类中,但是一旦添加,该类便不再符合该协议,因为它不符合该协议似乎看不到协议扩展中的实现。
如何正确实施?


阅读 198

收藏
2020-07-07

共1个答案

一尘不染

我有一个类似的问题。这是我所做的。

  1. 将协议标记为@objc。
  2. 将我以默认行为扩展的所有方法标记为可选。
  3. 然后用Self。在#selector中
        @objc public protocol UpdatableUserInterfaceType {
      optional func startUpdateUITimer()
      optional var updateInterval: NSTimeInterval { get }
      func updateUI(notif: NSTimer)
    }

    public extension UpdatableUserInterfaceType where Self: ViewController {

      var updateUITimer: NSTimer {
        return NSTimer.scheduledTimerWithTimeInterval(updateInterval, target: self, selector: #selector(Self.updateUI(_:)), userInfo: nil, repeats: true)
      }

      func startUpdateUITimer() {
        print(updateUITimer)
      }

      var updateInterval: NSTimeInterval {
        return 60.0
      }
    }
2020-07-07