协议和代表之间的区别?

protocoldelegate什么区别?

和,

我们如何在protocol class声明variables

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

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

如果您在代码中声明了这一点,那么任何“符合”协议MyProtocol的类都可以用在variablesinstanceOfClassThatImplementsMyProtocol中 。 这意味着使用这个variables的代码知道它可以使用MyProtocol中定义的任何方法来使用这个特定的variables,而不pipe它是什么类。 这是避免inheritancedevise模式的好方法,避免了紧耦合。

代表是使用协议的语言function。 代理devise模式是devise代码以在必要时使用协议的一种方式。 在Cocoa框架中,委托devise模式用于指定符合特定协议的类的实例。 这个特定的协议指定了委托类应该实现的方法,以在给定的事件中执行特定的操作。 使用委托的类知道它的委托协议,所以它知道它可以在给定的时间调用实现的方法。 这种devise模式是解耦类的一个很好的方式,因为它使得交换一个委托实例变得非常容易 – 程序员所要做的就是确保replace实例或类符合必要的协议(即它实现了在协议中指定的方法)!

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

编辑:

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

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

然后编译器会给出警告,如果你给它分配一个没有实现协议的类。 这真的很有用。 你必须声明一个类实现了一个协议,并且在说这个协议的时候,你让其他类知道他们可以和你的类以特定的方式进行交互。 因此,如果将MyTextFieldDelegateClass的实例分配给UITextFielddelegate属性,则UITextField 知道它可以调用MyTextFieldDelegateClass的某些特定方法(与文本input,select等有关)。 它知道这一点,因为MyTextFieldDelegateClass已经表示,它将实现UITextFieldDelegate协议。

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

代表团:代表另一个对象(oops中的devise模式)

这是一种devise模式 ,其中一个名为委托的对象代表另一个对象并在另一个对象的请求下进行操作。在执行的某个点,它向它的委托发送消息; 该消息告诉委托人一些事件即将发生并要求一些响应。委托实现由消息调用的方法并返回一个适当的值

一个例子是appdelegate对象代表appobject行事。

协议:启用与inheritance无关的对象之间的通信

协议是程序接口的声明,其任何类都可以实现的方法。协议是客观的C 语言特性。简单地说,任何类都可以实现的方法列表。要使用这个,你需要确认协议。 例如UITableviewDatasource协议,其方法cellforRowAtIndexPath在协议中声明,但我们实现它来创buildtableview。

请参阅https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/StreamlineYourAppswithDesignPatterns/StreamlineYourApps/StreamlineYourApps.html

协议是一组符合该协议的类实现的方法(可选或必需)。 而委托则是指符合该协议的类,并将遵守协议中定义的方法。

看看这个更多的细节。

让程序中看到代表的声明

  id<myProtocol> *delegatingObject; 

委托对象保持对其他对象的引用,并在适当的时候向该对象发送消息。

协议是一组可以由任何类实现的相关属性和方法。

这意味着确认myProtocol(相关属性和方法组)的任何对象(idtypes)都可以作为委托来使用,或者您可以说任何具有所需学位(协议)的人员(id)都可以作为教师(委派) 。

一个重要的先决条件是先理解协议。 我build议你先看看这个简短的教程,然后看看什么是协议? 。 此外,你必须知道类和协议之间的区别,所以看Objective-C:类与协议和协议 的重点是什么? 。


protocol:只是实现function的蓝图。 任何采用该蓝图的课程都必须执行这些function。 (不要错误地调用一个函数来实现一个函数)

delegate: 1是你也可以一个委托类没有 inheritance做的事情例如

例如,你有一个viewController,想要下载图片,或者想要得到客户与商店的距离,所以不要一个人做,而只需要一个中等的对象。 该对象被称为委托对象。 通常你会这样做:

 class ViewController : UIViewController , DownloaderDelegate{ //other code (inside viewDidLoad or elsewhere) you write: downloaderHandler.delegate = self // now self can also do WHATEVER the delegate can do...previously it was only a viewController but now it's 'almost' also a downloader 

非常类似于你为了符合tableViewDelegate而做的事情

 class ViewController : UIViewController , UITableViewDelegate{ //other code (inside viewDidLoad or elsewhere) you write tableView.delegate = self 

你现在的self也可以做tableView相关的东西。


delegate: 2但是这个对象(委托)是一个普通的香草对象(id或Any)。 这是愚蠢的! 你必须告诉它: “嘿,你需要有特定的function,以符合我们为你定义的协议(我们不会扩展任何或id,因为这将是愚蠢的,(相反),我们做了非常明确的限制协议“
在Objective-C中,这是一个纯粹的香草id ,所以你这样做

  @property (weak) id<DownloaderProtocol>delegate; 

在Swift中*你稍微容易一些:

 weak var delegate:DownloaderProtocol? 

协议来救援…委托实现(不使用)的function,但它适合您的委托类的需求。


*:在Swift中你没有id但你不需要它是等价的Any因为在Swift协议中也是一类公民types