记录关于协议在objectivec中的用法以及类比。之前我认为 objectivec 所谓的协议就是C#里的接口。oc里的协议支持继承,支持可选实现,支持嵌套的结构(在A协议使用B协议) 的意思。

像c#使用接口那样使用协议

我创建了一个默认的协议,继承了NSObject的协议,这个协议当然是可选的。不正经的说这里就像是C#的泛型约束(where class)。
我在这里标记了 @required ,这也是可选的,因为默认都是 @required。
@optional 也是可选的,标记了 @optional 就可以不必在继承此协议的类中使用。

1
2
3
4
5
6
7
8
9
10
11
#import <Foundation/Foundation.h>

@protocol PrintLine

@required
-(void)Log:(NSString*) content;

@optional
-(void)SayHello:(NSString*) content;

@end

可以在尖括号里添加多个协议

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import <Foundation/Foundation.h>
#import "Bar.h"
#import "PrintLine.h"

@interface Foo : NSObject<PrintLine,NSObject>
{
Bar* bar;
NSString* stringOnFoo;
}
@property (nonatomic) Bar* bar;
@property (nonatomic) NSString* stringOnFoo;

+(void)sayHello:(NSString*) name;

-(void)addObserver;

@end

如果想要知道一个协议是否被正在使用的类实现了,可以使用 confirmsToProtocal

1
2
3
4
5
6
7
8
9
10
11
12
13
#import <Foundation/Foundation.h>
#import "Foo.h"
#import "PrintLine.h"

int main(int argc, const char * argv[]) {
Foo* fo = [[Foo alloc]init];

if ([fo conformsToProtocol:@protocol(PrintLine)]) {
[fo Log:@"protocal"];
}

return 0;
}