Iphone Objective-C中的协议范式

Iphone Objective-C中的协议范式,iphone,objective-c,ios,interface,xcode4,Iphone,Objective C,Ios,Interface,Xcode4,可能重复: 最近我开始了解objective C。到目前为止,我已经开始编写简单的代码,所有新手都会编写这些代码来理解编程模型是如何工作的。然而,当我开始学习协议时,我突然感到困惑。我基本上来自java背景,所以我想**协议必须与接口类似 所以关于协议的问题是 为什么协议需要可选功能?与下面的代码类似, @protocol DuckProtocol @required -(void) quack; @optional -(void) fly; //Not all ducks can fly @

可能重复:

最近我开始了解objective C。到目前为止,我已经开始编写简单的代码,所有新手都会编写这些代码来理解编程模型是如何工作的。然而,当我开始学习协议时,我突然感到困惑。我基本上来自
java
背景,所以我想**协议必须与
接口类似

所以关于协议的问题是

为什么协议需要可选功能?与下面的代码类似,

@protocol DuckProtocol
@required
-(void) quack;
@optional
-(void) fly; //Not all ducks can fly
@end
上面的代码并没有帮助我理解,拥有协议(java中的接口)的目的是约束程序员,以确保他们在实现该协议的类中实现了所有列出的方法。为什么我们需要
@可选的

如果有人用过这个,你能分享一下你对这个范例如何帮助你的想法吗

谢谢

但是,有些是这样。
因此,
@可选的
是为那些能够飞行的人而实施的

在现实世界中,有些方法需要为某些类实现,而不是为所有类实现。
在Objective C中,协议的实现者可以使用
@optional
灵活地让程序员决定是否实现定制类的方法


最好的例子是
UITableViewDataSource

协议通常用于为类提供特定的功能。但是,协议中的所有方法并不总是必须为特定任务定义的。类“成为”某个协议并不需要的所有方法都是可选的


协议通常用于定义委托。要使一个类成为另一个类的可能委托(或多或少类似于回调),它必须响应协议中定义的某些消息(方法调用)。在某些情况下,委托的某些方法永远不会被调用,因为它们不适用于情况和设置。这些方法在协议中可以是可选的,因此它们不必在委托中实现。如果它们都是必需的,就像在Java中一样,那么无论如何它们都可能被实现为空方法


我想,方法是动态调用的,这一事实使这变得容易多了。调用委托的类实际上可以在尝试调用委托之前检查委托上是否实现了方法

我对
@optional
的方法是,它允许有保证(但不必要)定制对象的行为。考虑<代码> UITABLE VIEW DATABOSCE 协议。它有11种方法,但要制作一个函数表,只需要实现其中的2种。其他9种方法仅用于表定制,苹果本身提供了合理的默认值。

正如所回答的,协议中的可选方法可能在特定的一系列事件后触发。为了仍然遵守协议并实现它,您只需要所需的方法并增加灵活性

另请参阅有关协议的apple文档


请注意,它实际上与java接口不同,因为类可以实现协议,而无需声明来实现它

协议定义了类在执行某些任务时遵循的方法,通常是其他类实例的委托

例如,UITableViewDataSource协议定义了一些方法,如
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
-(NSInteger)节数表视图:(UITableView*)表视图

第一个是必需的,另一个是可选的。因为表视图需要知道要显示多少行,但不需要知道有多少节(默认为1节)。因此,第二个方法在UITableView.h的@optional下声明。创建将用作表视图数据源的类时,将其定义为
@interface ClassName:SuperClassName
,它告诉编译器您的类符合此协议


如果不实现第一种方法,编译器会告诉您实现不完整,但如果不实现第二种方法,代码将在没有警告的情况下生成和运行。

Objective-C协议确实与Java接口类似。它们提供了一个抽象级别,可以在使用支持协议的类的任何类中启用多态性。这意味着使用协议实现之一的任何类都可以确保特定方法可用

可选方法就是他们所说的:可选。任何采用协议的类都可以实现这些方法,但它们不是必需的


在实现委托设计模式时,协议的使用最为有用。无论何时为类或回调方法声明委托,强制委托符合协议可确保所有必要的回调都可用。在UI开发中,这通常确保您的视图将适当地响应更新的数据存储或网络事件

简单。Objective-C为我们提供了跳过我们不需要的方法的实现的条款

Java中的Consier
KeyListener
。如果您实现了它,那么您必须实现所有方法keyPressed(KeyEvent e)、keyereleased(KeyEvent e)和keyTyped(KeyEvent e),即使您不需要所有这些方法


但是,在Objective-C中,您可以指定
@可选的
方法来省略不必要的方法实现

我正在编写一个HTTPRequest框架,它有一个协议,其中包含如下方法,需要由使用我的框架上载/下载文件的类来实现

@protocol HTTPRequestDelegate
@required
-(void)HTTPRequestSuccessWithData:(NSDictionary *)inDictionary;
-(void)HTTPRequestFailedWithError:(NSError *)inError;
@optional
-(void)fileUploadPercentage:(NSInteger)inPercent;
@end
现在,使用我的框架上传/下载文件的类必须实现@required方法才能获得上传/下载的结果,但只有在我
@protocol HTTPRequestDelegate
@required
-(void)HTTPRequestSuccessWithData:(NSDictionary *)inDictionary;
-(void)HTTPRequestFailedWithError:(NSError *)inError;
@optional
-(void)fileUploadPercentage:(NSInteger)inPercent;
@end