object-c,swift 中分类(category),类扩展(extension)的区别

首先先介绍一下category 和  extension的概念

分类(Category):

Category 是表示一个指向分类的结构体的指针。原则上它只能增加方法,不能增加成员(实例)变量。

使用场景:

☛ 可以减少单个文件的体积

☛ 可以把不同的功能组织到不同的category里

☛ 可以由多个开发者共同完成一个类

☛ 可以按需加载想要的category

 ☛ 声明私有方法

category原则上只能给某个已有的类扩充方法,不能扩充成员变量 (声明属性)

怎样生产一个category文件,这里就不做介绍了。

创建category文件后,会在项目里生成一个新的文件,为已有的类扩充方法。


object-c,swift 中分类(category),类扩展(extension)的区别_第1张图片
Person+Category.h 文件
object-c,swift 中分类(category),类扩展(extension)的区别_第2张图片
Person+Category.m文件

注意事项:1.扩充的方法如果与待扩展类里的方法同名,则会有编译警告,而且运行时会优先调用扩展的方法。

                  2.当有两个或多个扩展类里都有同一个方法,则最后一个参与编译的方法会被调用。

                  3.扩展类里可以调用待扩展类里的属性

                  4.扩展类里如果添加了扩充变量,编译和运行都不会报错,但调用时候会报错

category 不能添加属性是因为在分类的指针结构体中,根本没有属性列表。所以在分类中用@property声明属性,既无法生成成员变量也无法生成setter/getter方法。

手动添加setter/getter:


object-c,swift 中分类(category),类扩展(extension)的区别_第3张图片
object-c,swift 中分类(category),类扩展(extension)的区别_第4张图片
object-c,swift 中分类(category),类扩展(extension)的区别_第5张图片
需 #import "Person+Category.h"

不要忘记 #import "objc/runtime.h"

类扩展(extension):

Extension是Category的一个特例。类扩展与分类相比只少了分类的名称,不会创建新的文件。


object-c,swift 中分类(category),类扩展(extension)的区别_第6张图片

特点:

☛ 不仅可以增加方法,还可以增加实例变量(或者属性),只是该实例变量默认是@private类型的, 用范围只能在自身类,而不是子类或其他地方

☛  类扩展中声明的方法没被实现,编译器会报警,但是类别中的方法没被实现编译器是不会有任何警告的。这是因为类扩展是在编译阶段被添加到类中,而类别是在运行时添加到类中

☛ 类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。

☛ 定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有的。

extension 在Swift和OC中也是有区别的, 在Swift中特点:

∗ 添加计算实例属性和计算类型属性

∗ 定义实例方法和类型方法

∗ 提供新构造器

∗ 定义下标

∗ 定义和使用新的嵌套类型

∗ 使现有类型符合协议

扩展可以向类型添加新功能,但不能覆盖现有功能。添加方法与对应类的同名会报错

与OC不同的是,在Swift 的 extension 中 不可以直接添加属性。编译会报错


object-c,swift 中分类(category),类扩展(extension)的区别_第7张图片

和oc一样,我们可以用关联方法来添加属性:


object-c,swift 中分类(category),类扩展(extension)的区别_第8张图片
object-c,swift 中分类(category),类扩展(extension)的区别_第9张图片



你可能感兴趣的:(object-c,swift 中分类(category),类扩展(extension)的区别)