为什么会有这样的想法;事件侦听器“;在swift中,行动和协议之间有什么区别? 我的问题

为什么会有这样的想法;事件侦听器“;在swift中,行动和协议之间有什么区别? 我的问题,swift,xcode,swift4,Swift,Xcode,Swift4,作为一名正在学习swift的新程序员。我想知道为什么在事件侦听器的实现方式之间似乎存在任意的分歧 在一些教程中,有人指出,只需在故事板上的视图元素和视图控制器之间拖动即可创建动作(事件侦听器) 但在以后的教程中,我注意到某些类似事件侦听器的功能也以协议的形式实现 class ViewController: UIViewController, UIScrollViewDelegate { func scrollViewDidScroll(...) { ...

作为一名正在学习swift的新程序员。我想知道为什么在事件侦听器的实现方式之间似乎存在任意的分歧

在一些教程中,有人指出,只需在故事板上的视图元素和视图控制器之间拖动即可创建动作(事件侦听器)

但在以后的教程中,我注意到某些类似事件侦听器的功能也以协议的形式实现

class ViewController: UIViewController, UIScrollViewDelegate {
     func scrollViewDidScroll(...) {
         ...
     }
}
我的问题
  • 为什么有两种实现事件侦听器的方法
  • 动作是否只是包装好的协议方法(一个是建立在另一个之上的)
  • 每种方法的优点和缺点是什么

  • 协议就像合同。当一个类型符合协议时,编译器可以对该类型的行为进行推理,而无需在编译时知道该类型在运行时实际是什么。例如,滚动视图在编译时“知道”可能有一个实例想知道滚动视图何时滚动。因此,它向该实例发送此消息

    目标行动是完全不同的。使用目标动作模式,可以在对象之间创建连接。假设您在UI中有一个按钮,并将连接拖动到视图控制器。然后按钮有一个目标,当任何特定的事情发生时(例如内部触摸事件),按钮会向连接的元素发送一个动作。您甚至可以按此按钮查找所有已连接的目标

  • 第一个概念叫做Nextstep,它最初来自Nextstep。相对于监听器协议的优点是,您只需要在一个类中实现一个已经存在的方法。相反,对于Java中的事件侦听器,如果视图包含多个按钮,则始终需要一个单独的类或if-else链

    第二种设计模式称为。这对于需要几个不同回调的UI元素很有帮助,其中回调方法不能像操作方法那样对应于严格的签名,或者可能具有与操作方法相反的返回值

  • 没有定义操作方法的协议。这是不可能的,因为名称可以自由选择。在iOS中,与所需形状匹配的每个方法(请参见上面的目标操作链接)都可以是操作方法
  • 您可以在一个Cocoa类中实现任意多个操作方法。动作方法很容易创建(比如在Java中实现
    Runnable
    ),并且由于名称的自由选择而非常灵活

    另一方面,委托具有更多的功能,并允许更精确地指定回调

  • 注意(与Java相比):您可以在Java中作为独立类或匿名(内联)类实现事件侦听器。这些事件监听器类中的每一个都可以包含一个相同类型的事件监听器,因此大多数情况下选择内联变量是为了避免不必要的大量类。匿名类还有一个优点,即它们可以访问周围类的属性

    但是,如果在一个操作中需要许多事件侦听器,那么代码会变得越来越复杂,并且由于缩进级别越来越高而变得越来越难以辨认,特别是如果事件侦听器是嵌套的


    相反,Cocoa中动作方法的嵌套深度是平坦的。随着动作方法的增多,课堂变得越来越长,但单个方法不会变得更复杂。

    它们是不同的还是一个构建在另一个之上?不,它们是完全独立的。您是否可以将每个单独问题的答案重新格式化为不同的答案1)2)3)。我觉得这会增加清晰度,帮助我和其他人更好地理解你说的话。或者甚至提供一些简短的伪代码示例来说明您的观点。非常感谢。
    class ViewController: UIViewController, UIScrollViewDelegate {
         func scrollViewDidScroll(...) {
             ...
         }
    }