组件化过程中,如果要把某一个业务独立抽一个库出来时,可能会遇到一个情况:
Worker类的Worker.h需要暴露出去被外界引用,但是Work中有一些属性或者方法又不希望暴露出去,只希望他们被这个库中的其他类引用。
///Work.framework的Worker.h
@interface Worker : NSObject
///name可以暴露出去
@property (nonatomic, copy, readonly) NSString* name;
///password和carBrand是个人信息不想暴露到Worker.framework以外
@property (nonatomic, copy, readonly) NSString* password;
@property (nonatomic, strong) NSString* carBrand;
- (instancetype)initWithName:(NSString*)name;
@end
这个时候就需要Extention出场了。
///Worker+Password.h 新定义一个头文件,定义了一个Worker的扩展,主要包含password属性
@interface Worker ()
@property (nonatomic, copy, readonly) NSString* password;
@end
///Worker+Driver.h 新定义一个头文件,定义了一个Worker的扩展,主要包含carBrand属性和driveCar方法。
@interface Worker ()
@property (nonatomic, strong) NSString* carBrand;
- (void)driveCar;
@end
定义Extention只能起到定义上的分离,Extention定义的属性和方法还是需要在主类Worker中得到实现或者初始化。
/// Worker.framework内Worker.h
@interface Worker : NSObject
@property (nonatomic, copy, readonly) NSString* name;
- (instancetype)initWithName:(NSString*)name;
@end
/// Worker.m
#import "Worker.h"
#import "Worker+Password.h"
#import "Worker+Drive.h"
@implementation Worker
- (instancetype)initWithName:(NSString *)name {
self = [super init];
if (self) {
_name = name;
_password = @"123";
_carBrand = @"NIO";
}
return self;
}
#pragma --mark private funcs
- (void)driveCar {
NSLog(@"%@ is driving a %@",self.name,self.carBrand);
}
@end
这样一来就实现了属性和接口的分离,Worker.framework对外只暴露了Worker.h,Worker的敏感信息比如password和carBrand以及私有方法driveCar都没有被暴露出去。
而Worker.framework内的其他类,如果想要访问敏感信息,比如password只需要引入Worker+Password.h头文件就可以了。
/// Wife.h
@class Worker;
@interface Wife : NSObject
- (void)getMoney:(Worker*)worker;
@end
/// Wife.m
#import "Wife.h"
#import "Worker.h"
#import "Worker+Password.h"
@implementation Wife
- (void)getMoney:(Worker *)worker {
if ([worker.password isEqualToString:@"123"]) {
NSLog(@"Get All money");
}
}
@end
总结起来就是:
1.利用Extention的特性,根据接口和属性的类型或者作用,可以定义多个.h文件。这些.h文件中定义多个Worker的Extention。
2.引用特性.h头文件,就可以正常使用想保护的属性或者方法了。
网友评论