记录关于协议在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; }
|
本文标题:Protocal in iOS
文章作者:Keyle
发布时间:2017-03-06
最后更新:2024-08-20
原始链接:https://vrast.cn/posts/cdd77a74/
版权声明:©Keyle's Blog. 本站采用署名-非商业性使用-相同方式共享 4.0 国际进行许可