一个 protocol
和一个 delegate
的区别是什么?
另外,
我们如何在 protocol类
中声明 变量
?
一个 protocol
和一个 delegate
的区别是什么?
另外,
我们如何在 protocol类
中声明 变量
?
在Objective-C中,使用(@protocol
语法声明的协议)用于声明一组方法,该类"采用"(声明将使用此协议)将实现。这意味着您可以在代码中指定,“只要实现特定协议,就不关心使用哪个类”。在Objective-C中,可以通过以下方式完成:
id<MyProtocol> instanceOfClassThatImplementsMyProtocol;
如果在代码中声明了此内容,则任何符合协议MyProtocol的类都可以在变量instanceOfClassThatImplementsMyProtocol中使用。这意味着使用此变量的代码知道它可以使用MyProtocol中定义的任何方法,而不管它是什么类。这是避免继承设计模式的好方法,并避免紧密耦合。
委托是协议语言特性的一种使用方式。委托设计模式是一种设计代码以在必要时使用协议的方法。在Cocoa框架中,委托设计模式用于指定符合特定协议的类的实例。这个特定协议指定了委托类应该实现以在给定事件中执行特定操作的方法。使用委托的类知道它的委托符合协议,因此它知道可以在给定时间调用已实现的方法。这种设计模式是解耦类的好方法,因为它使得很容易将一个委托实例替换为另一个 - 程序员所要做的就是确保替换实例或类符合必要的协议(即它实现了协议中指定的方法)!代理模式:
它是一种设计模式,其中一个名为代理的对象代表另一个对象并应其请求行事。在执行的某个点上,它向其代理发送消息;该消息告诉代理某些事件即将发生,并请求某些响应。代理实现由消息调用的方法并返回适当的值。
一个例子就是appdelegate对象代表appobject行事。
协议:
协议是声明编程接口的程序界面,任何类都可以实现其方法。协议是objective c 语言特性。简单来说,它是一个类可以实现的方法列表。要使用它,您需要确认该协议。例如UITableviewDatasource协议,其中的cellforRowAtIndexPath方法在协议中声明,但我们为创建表视图而实现它。
cellForRowAtIndexPath()
和numberOfRowsInSection()
,这些规则(协议)被定义为UItableview类中的必要协议。
还有其他的协议,如heightForRowAtIndexPath()
是可选的。didSelectRowAtIndexPath()
,它会向您发送一个事件的消息。
如果您将代理设置为self,则表示您的控制器已准备好处理该事件。协议(protocol)
只是一组需要实现的函数的蓝图。任何采纳该蓝图的类都将必须实现这些函数。(不要将实现函数与调用函数混淆)
代理(delegate)
1让你能够在不使用继承的情况下执行委托类所做的事情,例如:
例如,您有一个视图控制器,想要下载图片或者获取客户到店铺的距离,而不是自己完成所有这些工作,您可以使用一个中介对象来帮您完成。该对象被称为代理对象。通常,您会这样做:
class ViewController : UIViewController , DownloaderDelegate{
//other code
// inside viewDidLoad or elsewhere you write:
downloaderHandler.delegate = self // now self can also use whatever the delegating object gives it...previously it was only a viewController but now it's 'almost' also a downloader
class ViewController : UIViewController , UITableViewDelegate{
//other code
// inside viewDidLoad or elsewhere you write
tableView.delegate = self
现在您的self
也可以执行与tableView相关的操作。
delegate:
2
id
,所以你要这样做。 @property (weak) id<DownloaderProtocol>delegate;
weak var delegate:DownloaderProtocol?
协议来拯救...代理实现(而不是使用)该函数以适应委托类的需求。
id
类型,但是你也不需要它的等效类型Any
,因为在Swift中协议也是一种第一类公民类型。让我们来看一下程序中委托的声明
id<myProtocol> *delegatingObject;
delegatingObject 保持对其他对象的引用,并在适当的时候向该对象发送消息。
协议是一组相关的属性和方法,可以由任何类来实现。
这意味着任何确认 myProtocol(一组相关的属性和方法)的对象(id 类型)都可以作为代理工作,或者您可以说任何拥有所需学位的人(id)都可以作为教师(delegate)工作。
Delegate和Protocol属于视图控制器或类之间的(一对一)通信模式概念。
这意味着一个类或视图控制器正在与另一个类或视图控制器进行交流(记住一对一通信)。
第一个类或视图控制器通过确认第二个类的协议,将其引用(委托)给它正在交流的第二个类。
使用第一个类的引用,第二个类代表第一个类完成工作,并因此向第一个类提供信息。
请通过以下链接观看实现该概念的视频: https://www.youtube.com/watch?v=DBWu6TnhLeY。
正式解释是- Protocol是一组方法(可选或必需),由确认该协议的(第一)类实现。而delegate是指确认该协议的(第一)类的引用,并将遵守实现协议中定义的方法。
assign
修改为weak
,一旦委托被释放并在未来访问时,程序就会崩溃。 - Genki