iOS APP 开发 OC 第二十二天,Extension

tags: OC 30 day

延展: Extension

  1. 是一个特殊分类,所以延展也是类的一部分。
  2. extension 没有名字
  3. 只有声明,没有实现。与本类共享一个实现。

Extension的语法

语法:
@interface 本类名()

@end

没有实现。和本类共享一个实现。

为类添加Extension的步骤

只有一个.h文件。文件名称:本类名_取得文件名.h。
这个文件中只有Extension的声明。
@interface Person()

@end


新增一个OC文件,File Type点选 Extension。

Extension 的基本使用

  1. Extension 的本质是一个分类,作为本类的一部分。只不过是一个特殊的分类,没有名字。
  2. 延展只有声明,没有单独的实现,合本类共享一个实现。

Extension 与 class 的区别

  1. 分类有名字,Extension没有名字,是一个匿名的分类。
  2. 每一个分类都有单独的声明和实现,而Extension只有声明,没有单独的实现,和本类共享一个实现。
  3. 分类只能新增方法,而延展中任意成员都可以写。
  4. 分类当中可以写@property 但是只会生成 getter setter的声明。Extension中写@property 会自动生成私有属性,也会生成getter setter的声明实现。

Extension的应用场景

为类写一个私有的 @property 。

生成的getter,setter方法只能在类的内部访问,不能在外部访问。
其实,我们可以想: @property生成私有属性,生成getter setter的实现,不要声明。

@implementation Person
{
    int _age;
}
- (void)setAge:(int)age
{
    _age = age;
}
- (int)age
{
    return _age;
}
@end

我们可以在 @implementation 里面声明一个变数,再赋予他getter与setter。但是这样又回到了原点,我们想要利用 @property简化getter与setter的流程。

那我们该怎麽做? Extension

@interface Person()

@property(nonatomic,assign)int age;

@end

@implementation Person
@end

这个操作有实现,会实现在哪里呢? @implementation 。

Extension 在100%的情况下不会独占一个文件。都是将延展直接写在本类的实现文件当中。这个时候,写在延展中的成员,就相当於这个类的私有成员,只能在本类的实现中访问,外部不能访问。
如果想要为类写一个私有属性,虽然我们可以定义在@implementation之中,但是请不要这麽写,这样很不规范。写一个Extension,定义在Extension当中。
也建议声明写在延展当中,实现写在本类的实现当中。提供代码的阅读性。
如果想要为类写一个私有的 @property 就直接写在Extension就可以了。

Extension 天生就是私有化类的成员的

如果类的成员只希望在类的内部访问,那麽就将其定义在延展中。
如果类的成员允许被外界访问,定义在本类的interface之中。


<<:  浅谈无状态这件事 Stateless

>>:  详解资料仓库的实施步骤,实战全解!(2)

RDS 即时监看

除了警示之外, DBA也可能需要即时监看, 立即找出问题所在. RDS也提供即时监看面板. 在资料库...

[Day 15] Sass - Loop

Hi 终於来到第15天了(一半了!!!) 今天要写的是关於Sass-Loop回圈,回圈很常与前几天介...

Day16 跟着官方文件学习Laravel-初写测试

今天要来写测试,laravel有提供测试的方法。其中分成Unit及Feature,Unit专注於功能...

Day24:终於要进去新手村了-Javascript-函式-物件建立练习

这一篇我会使用彭彭教学中的例子加上自己理解的方式做解释以及纪录。 在彭彭课程之中的程序码如下: va...

资安设备与产品篇

相信一定有很多很多人有这麽听人说过: 「要肯花钱,才能做好资安」 「资安就是要花钱才能做好」 「老板...