OC 基础 协议分类扩展(延展)继承的使用(源码)

OC 基础 协议分类扩展(延展)继承的使用(源码),第1张

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。 协议 协议的创建:




上面的过程就是创建协议的过程,一般开发过程中,可以自己创建一个协议的文件,然后写自己需要的协议方法,你可以在某个已有的文件的.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

需求二:View跟Model解耦

参考代码: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)是面向对象语言都有的特性,使用继承可以定义一个具有父类所有功能的新类,即它继承了父类的所有功能。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/996583.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存