写点什么

iOS 中的 Protocol

作者:NewBoy
  • 2022 年 7 月 13 日
  • 本文字数:2072 字

    阅读完需:约 7 分钟

Protocol 基本概念

  • 类似于 java 的接口 interface,接口就是一堆方法的声明,没有实现,在 OC 中接口是由一个叫做协议的 Protocol 来实现

Protocol 语法格式

  • Protocol 的定义


@protocol SportProtocol <NSObject>- (void)playFootball;- (void)playBasketball;- (void)run;@end
复制代码


  • 类遵守协议

  • 一个类可以遵循 1 个或多个协议

  • 任何类只要遵循了 Protocol 就相当于拥有了 Protocol 的所有的方法声明


#import <Foundation/Foundation.h>#import "SportProtocol.h"@interface Person : NSObject<SportProtocol>
@end
复制代码

Protocol 和继承区别

  • 继承之后默认就有实现,而 Protocol 只要声明没有实现

  • 相同类型的类可以使用继承,但是不同类型的类只能使用 Protocol

  • Protocol 可以用于存储方法声明,可以将多个类中共有的方法抽取出来,以后让这些类遵守协议即可

Protocol 和 category 区别

  • Category 给一个类可以扩充方法,既有申明也有实现,而 Protocol 只有声明,没有实现

  • Category 和 Protocol 都可以声明方法,不能声明属性

Protocol 注意事项

  • Protocol 可以用 @property 形式声明属性,只不过在 Protocol 中声明的属性,只有对应的 setter/getter 方法声明,并没有生成对应的成员变量


Protocol:


@protocol SportProtocol <NSObject>@property (nonatomic,copy) NSString *sportType;- (void)playFootball;- (void)playBasketball;- (void)run;@end
复制代码


实现类:


#import <Foundation/Foundation.h>#import "SportProtocol.h"@interface Person : NSObject<SportProtocol>@end
#import "Person.h"@implementation Person@synthesize sportType=_sportType;
- (void)readSportType{ NSLog(@"%@",_sportType);}@end
复制代码


上面方法中主要用到了 @synthesize sportType=_sportType , 意思是说,sportType 属性为 _sportType 成员变量合成访问器方法。


 Person *p =[[Person alloc]init]; p.sportType = @"sport"; [p readSportType];
复制代码


  • 父类遵守了某个类的 Protocol,那么子类也会自动遵守这个 Protocol


#import <Foundation/Foundation.h>#import "SportProtocol.h"@interface Person : NSObject<SportProtocol>@end
复制代码


#import "Person.h"@interface Student : Person@end
复制代码


Student *stu = [[Student alloc]init];[stu playBasketball];
复制代码


  • 一个类可以遵守多个 Protocol


#import <Foundation/Foundation.h>#import "SportProtocol.h"#import "StudyProtocol.h"@interface Person : NSObject<SportProtocol,StudyProtocol>@end
复制代码


  • Protocol 又可以遵守其他 Protocol,只要一个 Protocol 遵循了其他 Protocol,那么这个 Protocol 就会自动包含其他 Protocol 的声明


#import <Foundation/Foundation.h>#import "BaseProtocol.h"@protocol StudyProtocol <BaseProtocol>- (void)studyEnglish;- (void)studyChinese;@end
复制代码

基协议

  • NSObject 是一个基类,任何其他类都要继承它

  • 还有个名字也叫 NSObject 的 Protocol,它是一个基协议

  • NSObject 协议中声明最基本的方法(description、retain、release 等等)

  • 每个新协议都遵循 NSObject


#import <Foundation/Foundation.h>@protocol BaseProtocol <NSObject>
@end
复制代码

Protocol 关键字

  • @required:这个方法必须实现,默认就是 required(若不实现,编译会报错)

  • @optional:这个方法不一定要实现


@protocol SportProtocol <NSObject>@required- (void)playFootball;- (void)playBasketball;
@optional- (void)run;- (void)readSportType;@end
复制代码

简单应用

要求:一个人需要一个 app,这个 app 必须有学习、买东西、分享等功能处理思路:1、需要创建一个人和 APP2、需要创建一个 Protocol 来描述这些功能 3、人拥有的 APP 要实现这些功能 4、APP 需要遵循这个 Protocol 且实现它


#import <Foundation/Foundation.h>@protocol DoSomethingProtocol <NSObject>- (void)buySomething;- (void)studyEnglish;- (void)shareInfo;@end
复制代码


#import <Foundation/Foundation.h>#import "DoSomethingProtocol.h"@class APP;@interface Person : NSObject//拥有的APP要实现Protocol的功能@property (nonatomic,strong) APP<DoSomethingProtocol> *app;@end
复制代码


#import <Foundation/Foundation.h>#import "DoSomethingProtocol.h"@interface APP : NSObject<DoSomethingProtocol>@end
#import "APP.h"@implementation APP- (void)buySomething { NSLog(@"%s",__func__);}- (void)shareInfo { NSLog(@"%s",__func__);}- (void)studyEnglish { NSLog(@"%s",__func__);}@end
复制代码


Person *p = [[Person alloc]init];APP *app = [[APP alloc]init];//赋值的时候就会判断app是否是符合协议的app,如果app没有遵循协议就会报警告p.app = app;
//判断app是否有实现协议内容if([p.app respondsToSelector:@selector(buySomething)]){ [p.app buySomething];}if ([p.app respondsToSelector:@selector(studyEnglish)]) { [p.app studyEnglish];}if ([p.app respondsToSelector:@selector(shareInfo)]) { [p.app shareInfo];}
复制代码


发布于: 刚刚阅读数: 4
用户头像

NewBoy

关注

虽不年少,艳阳高照 2019.04.10 加入

还未添加个人简介

评论

发布
暂无评论
iOS 中的 Protocol_ios_NewBoy_InfoQ写作社区