一般来说,Extension用来给Class增加私有属性和方法,写在 Class 的.m文件。但是Extension不是必须要写在.m文件,你可以写在任何地方,只要在 @implementation 前定义就可以。所以我们可以利用这个特性实现属性隐藏。

Case: 模块内部需要访问某属性,模块外需隐藏。这种情况经常会遇到。例如对于某一公司来讲,每个员工都需要员工ID来唯一标识,但是员工作为自然人,在其他地方,别人不需要知道这个ID。所以对于该员工的ID,在公司内部需要访问,在外部需要隐藏。

定义一个company对象,一个person对象。

@interface Person : NSObject

@property (nonatomic, strong) NSString *name;

@end
@interface Company : NSObject

@property (nonatomic, strong) NSString *name;

- (void)addStaff:(Person *)person;

- (void)printAllStaffDisplayName;

@end

公司可以增加一个自然人当自己的员工。可以打印全部员工ID,

@interface Company ()

@property (nonatomic, strong) NSMutableArray<Person *> *staffs;

@end

@implementation Company

- (void)addStaff:(Person *)person {
person.companyID = [NSString stringWithFormat:@"大汉%ld",self.staffs.count];
[self.staffs addObject:person];
} - (void)printAllStaffDisplayName {
for (Person *staff in self.staffs) {
NSLog(@"name:%@ displayName:%@ \n",staff.name,staff.companyID);
}
} - (NSMutableArray<Person *> *)staffs {
if (!_staffs) {
_staffs = [NSMutableArray arrayWithCapacity:];
}
return _staffs;
} @end

可以看到在 Company 中需要访问 Person 的 companyID,所以我们给 Person 增加一个 Extention。写在 Company.h。

@interface Company : NSObject

@property (nonatomic, strong) NSString *name;

- (void)addStaff:(Person *)person;

- (void)printAllStaffCompanyID;

@end

@interface Person ()

@property (nonatomic, strong) NSString *companyID;

@end

这样我们就可以在模块内部增加了一个public属性,而模块外部不知道有这个属性。

    Company *cisco = [Company new];
cisco.name = @"cisco"; Person *tao = [Person new];
tao.name = @"涛"; [cisco addStaff:tao];
[cisco printAllStaffDisplayName];

关于这个特性,可以参考sunny的文章:http://blog.sunnyxx.com/2016/04/22/objc-class-extension-tips/。但是,当你运行的时候会发现,crash了!log显示找不到setCompanyID方法,原来我们把extention写在非.m文件的时候,oc不会帮我们自动生成set,get方法。我想手动写一个set方法来解决这个问题,发现如果想在 @implenmatation 写,就必须知道他的实例变量 _companyID,我们现在拿不到。联想到readOnly属性可以使用 extention 在.m中修改为readWrite:

.h

@interface Person : NSObject

@property (readonly, nonatomic, strong) NSString *gender;

@end

.m

@interface Person ()

@property (nonatomic, strong) NSString *gender;

@end

@implementation Person

@end

那我们也可以在 Person.m 中再次申明一个companyID的私有属性。这样,oc会帮我们自动生成set,get方法。试验一下,完美!

@interface Person ()

@property (nonatomic, strong) NSString *companyID;

@end

@implementation Person

@end

Demo下载

巧用 Class Extension 隐藏属性的更多相关文章

  1. Dos命令的巧用 - 转载

    Dos命令的巧用 豪华绚丽的Windows让人们把DOS抛到遥远的记忆角落,然而,真正有价值的东西不会轻易退出历史的舞台.很多人都已经习惯于 Windows的图形化用户界面,熟不知古老的DOS命令却可 ...

  2. 完美实现保存和加载easyui datagrid自定义调整列宽位置隐藏属性功能

    需求&场景 例表查询是业务系统中使用最多也是最基础功能,但也是调整最平凡,不同的用户对数据的要求也不一样,所以在系统正式使用后,做为开发恨不得坐在业务边上,根据他们的要求进行调整,需要调整最多 ...

  3. 152-技巧-Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv

    152-技巧-Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv 附件下载地址:https://jiaopengzi.com/2602.html 一.背景 在我们使用 ...

  4. Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍

    摘要 : 本章节介绍NetExt常用的命令. 并且对SOS进行一些对比. NetExt的帮助 要想玩好NetExt, 入门就得看帮助. 看NetExt的帮助可以调用!whelp 命令. 这样hi列举出 ...

  5. Windbg Extension NetExt 使用指南 【1】 ---- NetExt 介绍

    摘要 : 在使用WINDBG做debugging的时候,需要一个好的工具帮助进行数据分析. 最常见的extension包括SOS, PSSCOR.  NetExt则是另外一种提供了丰富命令功能的deb ...

  6. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  7. PHPmailer关于Extension missing: openssl报错的解决

    最近在写一个网页的时候,需要用到PHPmailer来发送邮件,按照官网上给出的demo写出一个例子,却报错Extension missing: openssl 最后发现需要修改php.ini中的配置: ...

  8. [MySQL性能优化系列]巧用索引

    1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...

  9. 研究Extension和Category的一个例子

    Category: 1. 无法添加实例变量 2.将类的实现分散到多个不同文件或多个不同框架中. Extension: 1. 可以添加实例变量 注: 如果Category的头文件中也使用Extensio ...

随机推荐

  1. D. AB-string ( 思维 )

    传送门 题意: 给你一个长度为n的字符串, 字符串只由 A B 组成. 问你这个字符串存在多少个 good string: ( 连续的一段子串 ) good string 的定义就是: 字符串中所有的 ...

  2. fmt

    fmt.Println("hello world") fmt.Printf("%T",a)打印a 的类型 fmt.Printf("%v",a ...

  3. 国庆集训Day1

    T1 divide 题意: 有\(n\)个数 \(a_1, a_2,..., a_n\) 有m个数\(b_1, b_2,..., b_n\) 令\(a = a_1\times a_2\,\times ...

  4. 创建全局变量用以保存传递MFC中不同窗口中的数据

    格式如下: //DATA_TEMP.h class CDATA_TEMP{public: CDATA_TEMP(); virtual ~CDATA_TEMP();public: static int ...

  5. cyk追楠神系列一(SDUT3703)

    cyk追楠神系列一 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 众所周知,cyk ...

  6. Selenium高亮显示定位到的元素

    在调试Selenium脚本中,有时因为操作太快或操作不明显而不清楚是否定位到了正确的元素.我们可用通过执行js为定位到的元素添加样式,来高亮显示定位到的元素. 在Selenim Webdriver中, ...

  7. 5分钟记住列表的使用功能-Python基础前传(7)

    学习任何一门技术,最重要的是逻辑而不是内容,仅会内容,我们仅仅是技术的使用者,但如果我们懂得了技术背后的逻辑,我们就是技术的创造者,所以同样领域的工作,有人月入5千,有人月入5万,就是这个差别: 学技 ...

  8. c#简单的SQLHelp

    public abstract class SQLHelper { //只读的静态数据库连接字符串 //需添加引用System.Configuration; public static readonl ...

  9. 2016百度之星资格赛 Problem A(前缀积与求逆元)

    题意:给出一个字符串,每次询问给出x和y要求算出从x到y的每个字符的(ASCII 码值-28)的值的积(mod9973). 分析:首先的想法肯定是算出每个位置的前缀积,然后只要F[y]/F[x-1]即 ...

  10. Are Lights Still On?

    不知不觉成为一名OIer已经接近一年了,但真正开始认真对待还是这个暑假,从当初的信心百倍,踌躇满志,到现在陷入了迷茫. 我不知道自己是否真的热爱OI这项事业,可我不愿放弃:我也不知道自己还有没有继续学 ...