gpt4 book ai didi

ios - Swift 2.2 #selector for delegate/protocol 编译错误

转载 作者:可可西里 更新时间:2023-11-01 01:36:48 27 4
gpt4 key购买 nike

这是我的代码:

protocol CustomControlDelegate: AnyObject {
func buttonTapped(sender: AnyObject)
}

class CustomControl: UIView {
var delegate: CustomControlDelegate? {
didSet {
aButton.addTarget(delegate, action: "buttonTapped:"), forControlEvents: UIControlEvents.TouchUpInside)
}
}

从 Swift 2.2 开始,我收到一个要求使用 #selector 的编译错误。但在这种情况下,我不知道如何正确使用#selector。

编译器给出了这样的建议:

enter image description here

但是当它被使用时,它给出了另一个编译警告:

enter image description here

我试过了,没有遇到编译错误,但是,我怀疑这是不是正确的解决方案。我不想将 @objc 添加到我的协议(protocol)中:

@objc protocol CustomControlDelegate: AnyObject {
func buttonTapped(sender: AnyObject)
}

class CustomControl: UIView {
var delegate: CustomControlDelegate? {
didSet {
aButton.addTarget(delegate, action: #selector(CustomControlDelegate.buttonTapped(_:)), forControlEvents: UIControlEvents.TouchUpInside)
}
}

最佳答案

我看不出有什么理由要在这里避免 @objc。该方法必须是 @objc 以便 Objective-C 运行时调用它。您不能将 @objc 放在方法声明中,因此传达意图的唯一方法是使协议(protocol)成为 @objc

@objc protocol CustomControlDelegate {
func buttonTapped(sender: AnyObject)
}

虽然协议(protocol)是@objc,但是实现类不需要是@objc——只需要制作方法@objc即可编译器很高兴。

class MyControlDelegate: CustomControlDelegate {
// ^ no `@objc`, not deriving NSObject
@objc func buttonTapped(sender: AnyObject) {
// ^ making just this method `@objc` is enough.

}
}

然后您可以使用 #selector(CustomControlDelegate.buttonTapped) 而不会出现错误或警告。

关于ios - Swift 2.2 #selector for delegate/protocol 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36337420/

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