iOS学习之协议浅谈

iOS学习之协议浅谈

一、协议的定义

协议是多种类共享的方法列表 
协议定义了一系列的方法,其中这些方法又分为选择实现和必须实现。下面我们会详细说明。

二、如何定义一个协议

1.协议的定义

定义一个协议很简单,在@protocol后加上所定义的协议的名称,然后就像接口部分一样,定义一些方法,但是要注意只列出方法有哪些,并不给出具体代码块,@end之前所有方法声明都是协议的一部分。 
举个例子:下面是在标准的Foundation框架头文件NSObject.h中定义NSCopying协议的方式:

1. NSObject.h:
2. @protocol NSCopying
3. -(id) copyWithZone:(NSZone*) zone;
4. @end

一个类采用协议的方式: 
例如:@interface Fraction:NSObject <NSCopying ">注意在这里,协议名称放在父类后面,且在协议名称的左右两侧分别用“<“和”>“括起来,一个类可以使用多个协议,只需在尖括号里一个协议名称后面加个逗号,再写上协议名即可,比如<名称一,名称二,····> 这样就可以了. 
对于协议中的方法,不必在接口中声明它们(它们是从定义该协议的头文件中获得),因此只需在实现部分定义它们即可。 
上面我们说到有选择实现和必须实现。下面我们来说明一下。在定义协议中,如果用到@optional 那么其以下的方法都是选择实现的,其上面的则自然是必须实现的。例如:

1.@protocol Drawing
2.-(void) paint;
3.-(void) grease;
4.@optional
5.-(void) outline;
6.@end

我们还可以在协议中通过使用@required指令来列出需要的方法(即必须实现的方法) 
总的来说,在@optional 下面的是选择实现,可选可不选,若无@optional则默认是必须实现,但是,这里默认的必须实现,其实也可以不实现,只是会出现警告,但是用@required修饰的方法,则是一定要实现的,不实现的话,编译不通过。比如说,我某个类要使用这个protocol,那我并不一定要实现这个protocol里面所有的方法,我只需要实现我需要用到的和他指定你要实现的,就是用了require修饰的。那么默认的没有修饰的,我们如果没有实现这个方法,编译器就会有一个警告⚠️,但是我并没有使用这个方法的话,程序就不会出现问题。 
但是,加了require修饰的方法是必须实现,否则无法编译通过。 
默认的,你不实现,是可以编译通过的,只是会有一个警告⚠️ 
可以使用conformsToProtocol方法来检查一个对象是否遵循某项协议。 
例如:

这里使用的专用@protocol指令用于获取一个协议名称,并产生一个protocol对象,conformsToProtocol:方法期望这个对象作为他的参数。 
为了测试currentObject是否实现了可选的outline方法,可以编写下列代码:

在定义一个协议时,可以扩展现有协议的定义: 

protocol Drawing 3D<Drawing'>,说明Drawing3D协议也采用了Drawing协议。因此,在任何采用Drawing3D协议的类都必须实现此协议列出的方法,以及Drawing协议的方法。

猜你喜欢

转载自blog.csdn.net/shandamengcheng/article/details/80367297