巧用 Class Extension 隐藏属性
一般来说,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
巧用 Class Extension 隐藏属性的更多相关文章
- Dos命令的巧用 - 转载
Dos命令的巧用 豪华绚丽的Windows让人们把DOS抛到遥远的记忆角落,然而,真正有价值的东西不会轻易退出历史的舞台.很多人都已经习惯于 Windows的图形化用户界面,熟不知古老的DOS命令却可 ...
- 完美实现保存和加载easyui datagrid自定义调整列宽位置隐藏属性功能
需求&场景 例表查询是业务系统中使用最多也是最基础功能,但也是调整最平凡,不同的用户对数据的要求也不一样,所以在系统正式使用后,做为开发恨不得坐在业务边上,根据他们的要求进行调整,需要调整最多 ...
- 152-技巧-Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv
152-技巧-Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv 附件下载地址:https://jiaopengzi.com/2602.html 一.背景 在我们使用 ...
- Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
摘要 : 本章节介绍NetExt常用的命令. 并且对SOS进行一些对比. NetExt的帮助 要想玩好NetExt, 入门就得看帮助. 看NetExt的帮助可以调用!whelp 命令. 这样hi列举出 ...
- Windbg Extension NetExt 使用指南 【1】 ---- NetExt 介绍
摘要 : 在使用WINDBG做debugging的时候,需要一个好的工具帮助进行数据分析. 最常见的extension包括SOS, PSSCOR. NetExt则是另外一种提供了丰富命令功能的deb ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- PHPmailer关于Extension missing: openssl报错的解决
最近在写一个网页的时候,需要用到PHPmailer来发送邮件,按照官网上给出的demo写出一个例子,却报错Extension missing: openssl 最后发现需要修改php.ini中的配置: ...
- [MySQL性能优化系列]巧用索引
1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...
- 研究Extension和Category的一个例子
Category: 1. 无法添加实例变量 2.将类的实现分散到多个不同文件或多个不同框架中. Extension: 1. 可以添加实例变量 注: 如果Category的头文件中也使用Extensio ...
随机推荐
- BZOJ 3925: [Zjoi2015] 地震后的幻想乡(概率DP)
这里有一篇很好很强的博客%%% YouSiki大佬的博客 多理解一会就行了- 代码 #include <bits/stdc++.h> using namespace std; typede ...
- Springboot注解@ServletComponentScan和@ComponentScan(转)
一.SpringBoot中使用Servlet在SpringBootApplication上使用@ServletComponentScan注解后,Servlet.Filter.Listener可以直接通 ...
- 浏览器顶部设置margin-top时存在的bug
浏览器bug<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8 ...
- 005_STM32程序移植之_RC522读卡模块
1. 测试环境:STM32C8T6 2. 测试模块:RC522读卡模块 3. 测试接口: RC522读卡模块: VCC------------------3.3V GND--------------- ...
- 开源分布式中间件 DBLE 快速入门指南
GitHub:https://github.com/actiontech/dble 官方中文文档:https://actiontech.github.io/dble-docs-cn/ 一.环境准备 D ...
- 047_批量下载有序文件(pdf、图片、视频等等)
#!/bin/bash#本脚本准备有序的网络资料进行批量下载操作(如 01.jpg,02.jpg,03.jpg)#设置资源来源的域名连接 url="http://www.test.com/& ...
- web批量下载文件到本地
JavaWeb 文件下载功能 文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端,所以文件下载需要IO技术将服务器端的文件读取到,然后写到response缓冲区中,然后再下载到个人客户端. 1 ...
- webuploader+文件夹上传
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- vue 中 v-model
一.v-model: 先上段简单的 vue 代码: // 定义 v-model 示例组件 Vue.component('bindData', { template:` <div> < ...
- 【概率论】4-2:期望的性质(Properties of Expectation)
title: [概率论]4-2:期望的性质(Properties of Expectation) categories: - Mathematic - Probability keywords: - ...