gpt4 book ai didi

ios - Swift 2.2 #selector 协议(protocol)扩展编译器错误

转载 作者:行者123 更新时间:2023-11-30 13:08:17 29 4
gpt4 key购买 nike

我有一个协议(protocol)扩展,它在 swift 2.2 之前可以完美运行。

现在我收到一条警告,告诉我使用新的 #selector,但如果我添加它

no method declared with Objective-C Selector.

我尝试在这几行代码中重现该问题,这些代码也可以轻松复制并粘贴到 Playground 中

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

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

最佳答案

我也遇到了类似的问题。这就是我所做的。

  1. 将协议(protocol)标记为@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
    }
    }

关于ios - Swift 2.2 #selector 协议(protocol)扩展编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39077659/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com