上面的过程就是创建协议的过程,一般开发过程中,可以自己创建一个协议的文件,然后写自己需要的协议方法,你可以在某个已有的文件的.h文件里面写一个协议出来,就像代理一样,cell或者view里面想使用代理的话。就在该文件创建一张协议。
iOS协议的用法相当于安卓的接口是一样的道理来的,它能够多继承,相当于遵守多张协议,然后就会拥有写了协议的方法,进行实现。
协议能定义属性,也能够定义方法,一般定义方法是比较多的,定义属性的话,定义之后只有setter/getter方法。没有成员变量无法赋值的。getter方法可以在遵守协议的类里面实现,但是setter方法没法在遵守协议的类里面实现,因为没有成员变量,所以就算定义了属性之后,只能读取不能实现。
参考代码:https://download.csdn.net/download/weixin_38716347/63205774
用法看下面的链接有代码:
一个对象可以利用协议监听另一个对象状态的变化(相当于监听器的思想,一个对象要充当另一个对象的监听,必须遵守某个协议.为了区别具体哪个对象被触发,一般会把当前触发的对象做为参数传到接口方法中)
在定义的协议里面可以修饰为必须实现的方法和可选择实现的方法。
参考代码:https://download.csdn.net/download/weixin_38716347/63207031
从ViewController跳去HomeViewController,然后HomeViewController返回到ViewController,然后带一个值回来。
下面就是实现代理的步骤,来来去去都是这些代码,很简单的。
HomeViewController.h
HomeViewController.mViewController.m
参考代码:https://download.csdn.net/download/weixin_38716347/63206925
我们在开发中,假如有一个tableViewCell,一般cell里面的控件都不暴露在外面的,如果model要对cell赋值,一般都是在cell里面的.h文件里面创建一个对应模型的属性。就像下面图片的样子。
这样子写的话,如果想把cell拿到另外一个项目里面去的话就会报错,原因就是找不到,这个模型,但是不会把模型也拿过去吧。
所以我当时定义了一个协议,协议里面有对cell赋值对应的属性。cell遵守这张协议后就拥有了这些属性,然后对cell的控件赋值,然后模型也遵守这张协议。然后为了不污染现有的模型,然后对模型写一个分类,分类文件里面使用到协议的属性之后就返回模型对应的值。
原理看下面的代码:
首先创建一张协议,协议里面有两个属性。
然后cell遵守这张协议,创建一个协议属性。
就能够点出协议里面的属性对cell进行复制
然后接口获取数据回来有一个模型存起来的,
(重点)为了不污染原来的类,类模型的类做了一个扩展,然后遵守协议,对值进行调用的时候返回
模型的赋值
参考代码:
说明一下:这种写法虽然可以做到解耦,但是写的代码量就变多了。而且cell的复用性很低的,放到别的项目里面去基本不会一模一样的相对于产品公司,如果是外包公司,用来用去都是这些设计就很难说,如果这样的话还不如把cell的控件暴露在.H文件直接访问方便,简单,直接。不过上面的应用只是一种写法。
这种写法我在2017年用swift的时候,写过这种写法的,现在是2021.12.10,去用OC写的时候关键了文件写了好久都写不出来。下面稍微的记录一下。
在swift里面下面的文件不知道怎么转换成OC。
因为我看到swift文件的extension 是扩展的意思,那么OC的扩展可以声明属性和方法,但是没有实现。没有.m文件就没有办法下下去了。我有把它写成继承,继承的话就相当于是另外的一个类了。更加不是。最后就是分类分类,我当时在想,这个文件的目的只是为了不污染原有类。现在为了能够实现这个功能,就直接把协议写到。然后才明白,写成分类(分类是在原有的类的基础上扩展出来,为自己的类添加新的方法),不过就算知道也不会写当时,好久没有写过了。
最后上代码
不过当时还有一个问题。没有对成员属性赋值。
参考代码:https://download.csdn.net/download/weixin_38716347/63206422
它就像tableView的数据源方法一样。这种写法就像我在构建够个UI出来的时候,如果需要用到某个数据的话,就通过代理出来把数据返回去。
直接上代码,先看自定义view
.h
.m
使用
参考考代码:
参考源码:https://download.csdn.net/download/weixin_38716347/63205585
分类就是在原有的类扩展出一个新的类,为了不影响原有类的完整性,去扩展出来类,只能添加方法,不能添加属性,但是可以通过runtime来去动态添加(下面有讲到)。
分类的创建:
创建之后得到对应的类别文件:
添加新的扩展方法:
这里以扩展NSString类的方法为例展示类别扩展的具体用法,分别添加一个类方法和实例方法,并在需要的地方调用:
#import "Person.h"
NS_ASSUME_NONNULL_BEGIN
@interface Person (SportMan)
// 游泳的方法
-(void)swimming;
@end
NS_ASSUME_NONNULL_END
#import "Person+SportMan.h"
@implementation Person (SportMan)
// 游泳的方法
-(void)swimming{
NSLog(@"游泳");
}
@end
如何为分类动态添加属性呢?
扩展文件的创建就是上面的创建过程,不过一般很少这样去写的,在开发项目的应用中,扩展一般都是些在需要扩展类的.M文件里面的。就像下面的图片一样使用。
扩展一般在项目用来,扩展私有属性和私有方法用的。
参考代码:https://download.csdn.net/download/weixin_38716347/63205418
集成是用的最多的开发项目中。子类继承父类,子类就拥有了父类的方法和属性。
继承(inheritance)是面向对象语言都有的特性,使用继承可以定义一个具有父类所有功能的新类,即它继承了父类的所有功能。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)