简单代理 设置

摘要:
根据配置,符合协议的类将实现协议中指定的几个方法。这更像是一种关系。我想做点什么,但我不想自己做。我委托他人为我做这件事。

一、理解协议与代理
协议是一个方法签名的列表,在其中可以定义若干个方法。根据配置,遵守该协议的类会去实现这个协议中规定的若干个方法。

代理是一个概念,很难用一个名词去定义(如我们可以说协议其实就是一个方法列表)。它更像是一种关系,我要做某一个事情,但我自己不想去做这件事,我委托其他人帮我去做这件事。这个时候,这位其他人就是我的代理。

二、协议的使用

在定义协议时,可以通过@required与@optional来配置遵守这个协议必须去实现的方法和可以选择的方法。譬如:

@protocol MyRootViewDelegate<NSObject>  

//必须的
@required  

-(void)ChooseDay:(id)choose;

//可选的

@optional  

-(void)hideThisView;

- (void)changeDateFormatter:(NSString*)formatString;  
@end  


在定义的协议 MyRootViewDelegate中,如果遵守该协议,就必须实现协议中的-(void)ChooseDay:(id)choose;方法,同时可以根据实际程序要求去实现 -(void)hideThisView; 与- (void)changeDateFormatter:(NSString*)formatString; 。

同时,协议支持对本身的一种扩展,譬如:

@protocol MyRootViewDelegate< MyChooseDayViewDelegate>  
-(void) doSomething; 
@end  


MyVRootViewDelegate扩展了MyChooseDayViewDelegate这个协议,也就是说,假如遵守了MyRootViewDelegate的话,也必须实现MyChooseDayViewDelegate中的方法(@required)使用分类的话,就是在定义类的头文件中使用<> 将所需要的协议引入,如果引入多个协议,用","分隔,譬如:

@interface MyClassView:UIViewController <MyRootViewDelegate, UIAlertViewDelegate>  
//TODO: balabalabala...  
@end  

在view.h中

#import <UIKit/UIKit.h>

//声明一个代理

@protocol EverySomthing

-(void)doSomthing;

@end

@interface LNView : UIView

@property(nonatomic,retain)NSTimer *timer;

@property(nonatomic,assign)NSInteger inter;

@property(nonatomic,retain)id<EverySomthing>mydelegata;

@end

view.m中

#import "LNView.h"

@implementation LNView

 -(id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) { 

        self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(actiiio) userInfo:nil repeats:YES];

        [self.timer fire];

        }

    return self;

}

 -(void)actiiio

{

    [self.mydelegata doSomthing];

}



想要检查某个类是否实现了某个协议或者某个类是否实现了某个协议的方法,可以通过以下方式来进行测试

 //在controller中检测

    ViewController *view=[[ViewController alloc]init];

    //判断该对象是否实现了EverySomthing  协议

    if ([view conformsToProtocol:@protocol (EverySomthing)])

    {

        NSLog(@"我实现了这个协议");

    } 

    //判断该对象是否实现了doSomthing 方法

    if ([view respondsToSelector:@selector(doSomthing)]) {

        NSLog(@"我实现了某个方法"); //  respondsToSelector是继承于NSObject

    }

免责声明:文章转载自《简单代理 设置》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇制作CocoaPods依赖库最后步骤修改三 APPIUM Android自动化 测试初体验下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

uniapp中组件属性设置不生效的解决方案

例如,每次将滚动视图组件的滚动顶部属性值设置为0时,只能第一次成功返回顶部。组件中滚动顶部的实际值更改后,其绑定属性不会同时更改。...

使用事务和SqlBulkCopy批量插入数据

类似与MicrosoftSQLServer包中名为bcp的命令行应用程序。但是使用SqlBulkCopy类可以编写托管代码解决方案,性能上优于bcp命令行应用程序,更优于如Insert方式向SQLServer表加载大量数据。SqlBulkCopy可以应用到大批量数据的转移上,而不管数据源是什么。之前在做winform开发的时候,发现当datagridview...

Element plus的tree组件实现单选和搜索功能

--elementplus树组件实现单选及搜索功能--˃Elementplus树组件实现单选及搜索功能获取选中的节点//给节点添加classconstcustomNodeClass==˃{if{return'no-checkbox-node';}returnnull;};exportdefault{name:'tree-radio',data(){retur...

vant上传文件到后端

Html代码&lt;Ts代码文件列表=[]/image/[a-zA-z]+/。test(file.file.type)){this.$toast(“请上传图片”);returnfalse;config).then(res=&gt;})。捕获(()=&gt;拒绝)=&gt;ts=“+newDate().getTime()).然后...

pycharm最新版本激活码(永久有效) python安装教程

输入python以查看当前版本的python。您可以输入“print'helloworld”并单击下载以启动PyCharm://pan.baidu.com//1eVdm4dUPKn3ZY_Xj kqNXw提取代码:l83f2,下载破解补丁(版本2018.3.5)下载链接至地址:...

愿你走出半生,归来仍是Java Parser

几天前,我的一个朋友给了我一个Haskell问题嘿,MK。假设我有一个BNF,我在Haskell中有一个这个BNF的解析器。现在,我想为这个BNF换一条线。是否有任何方法可以在不接触BNF解析器代码的情况下扩展BNF解析器?让我们想想,这个x是什么样的变体?请记住,传入的参数不是self,而是super。好了,openrecursion已经准备好了,剩下的是...