gpt4 book ai didi

ios - 协议(protocol)和委托(delegate)之间的区别?

转载 作者:IT老高 更新时间:2023-10-28 11:31:42 26 4
gpt4 key购买 nike

protocoldelegate 有什么区别?

和,

我们如何在protocol class中声明variables

最佳答案

使用(Objective-C 中的 @protocol 语法)声明的协议(protocol)用于声明类“采用”(声明它将使用此协议(protocol))将实现的一组方法。这意味着您可以在代码中指定“只要它实现特定协议(protocol),您就不会关心使用哪个类”。这可以在 Objective-C 中按如下方式完成:

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

如果您在代码中声明了这一点,那么任何“符合”协议(protocol)MyProtocol 的类都可以在变量instanceOfClassThatImplementsMyProtocol 中使用。这意味着使用这个变量的代码知道它可以使用 MyProtocol 中定义的任何方法和这个特定的变量,不管它是什么类。这是避免继承设计模式和避免紧耦合的好方法。

委托(delegate)是对协议(protocol)语言特性的一种使用。 delegation design pattern是一种设计代码以在必要时使用协议(protocol)的方法。在 Cocoa 框架中,委托(delegate)设计模式用于指定符合特定协议(protocol)的类的实例。这个特定的协议(protocol)指定了委托(delegate)类应该实现的方法,以在给定的事件中执行特定的操作。使用委托(delegate)的类知道它的委托(delegate)符合协议(protocol),因此它知道它可以在给定的时间调用实现的方法。这种设计模式是一种解耦类的好方法,因为它使得将一个委托(delegate)实例交换为另一个委托(delegate)实例变得非常容易——程序员所要做的就是确保替换的实例或类符合必要的协议(protocol)(即它实现了协议(protocol)中指定的方法)!

协议(protocol)和委托(delegate)不仅限于 Objective-C 和 Mac/iOS 开发,而且 Objective-C 语言和 Apple 框架也大量使用了这种令人敬畏的语言特性和设计模式。

编辑:

这是一个例子。在Cocoa Touch 的UIKit 框架中,有一个UITextFieldDelegate 协议(protocol)。该协议(protocol)定义了一系列方法,作为 UITextField 实例的委托(delegate)的类应该实现这些方法。换句话说,如果你想给一个UITextField 分配一个代理(使用delegate 属性),你最好确保这个类符合UITextFieldDelegate。其实是因为UITextField的delegate属性定义为:

@property(nonatomic, weak) id<UITextFieldDelegate> delegate

如果你给它分配了一个没有实现协议(protocol)的类,编译器会给出警告。这真的很有用。你必须声明一个类实现了一个协议(protocol),并且说它实现了,你让其他类知道他们可以以特定的方式与你的类交互。因此,如果您将 MyTextFieldDelegateClass 的实例分配给 delegate UITextField 的属性,UITextField 知道它可以调用您的 的某些特定方法(与文本输入、选择等相关) MyTextFieldDelegateClass。它知道这一点,因为 MyTextFieldDelegateClass 已经说过它将实现 UITextFieldDelegate 协议(protocol)。

最终,这一切都会为您的项目代码带来更大的灵 active 和适应性,我相信您在使用这项技术后很快就会意识到这一点! :)

关于ios - 协议(protocol)和委托(delegate)之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5431413/

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