当前位置: 首页 > 面试题库 >

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

陆弘新
2023-03-14
问题内容

我有一个协议扩展,它过去在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,但是如果我这样做,它还会要求我将其添加到实现该方法的类中,但是一旦添加,该类便不再符合该协议,因为它不符合该协议似乎看不到协议扩展中的实现。
如何正确实施?


问题答案:

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

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


 类似资料:
  • 问题内容: 给定两个协议及其扩展名: 并尝试使它们都符合: 我收到编译时错误: 类型“ SomeClass”不符合协议“ FirstDelegate” 交换和: 产生反向: 类型“ SomeClass”不符合协议“ SecondDelegate” 删除扩展之一可以解决此问题。同上为内部提供实现。 这个协议扩展功能对我来说还很新。此外,目前苹果官方的“快速编程指南(预发行版)”中有关此信息的信息很少

  • 扩展说明 RPC 协议扩展,封装远程调用细节。 契约: 当用户调用 refer() 所返回的 Invoker 对象的 invoke() 方法时,协议需相应执行同 URL 远端 export() 传入的 Invoker 对象的 invoke() 方法。 其中,refer() 返回的 Invoker 由协议实现,协议通常需要在此 Invoker 中发送远程请求,export() 传入的 Invoker

  • 协议和扩展 你可以扩展一个已经存在的类型来采纳和遵循一个新协议, 就算是你无法访问现有类型的源代码也行. 扩展可以添加新的属性、方法和下标到已经存在的类型, 并且因此允许你添加协议需要的任何需要. protocol TextRepresentable { var textualDescription: String { get } } // 此处并无Dice这个类, 以及其sides属性

  • 问题内容: 我想知道在一个仅包含初始化功能并且仅打算在具体类中进行扩展的简单类中,对于等效于该初始值设定项的协议等效于什么。 因此,最简单的方法可能就是显示代码-我正在寻找与以下内容等效的协议扩展: 我期望代码看起来像这样: 我已经看到其他StackOverflow问题中建议的解决方案,但是我不确定它们是否有效,也不确定在类初始化程序中专门解决此问题。 问题答案: 您必须提供一个有效的初始化链来创

  • 扩展说明 Java 代码编译器,用于动态生成字节码,加速调用。 扩展接口 org.apache.dubbo.common.compiler.Compiler 扩展配置 自动加载 已知扩展 org.apache.dubbo.common.compiler.support.JdkCompiler org.apache.dubbo.common.compiler.support.JavassistCom

  • 问题内容: 对于我的s ,我有一个非常简单的协议扩展,它具有通过轻击手势关闭键盘的功能。这是我的代码: 问题是上面的代码在此行上引发了编译错误: 带有错误信息: “ #selector”的参数引用实例方法“ on(tap :)”,而该方法未公开给Objective-C 并建议在“ 之前”添加“修复” 好的,我添加标签: 但是,随后,它在此新添加的标记上引发了不同的编译错误,并显示错误消息: @ob