iOS开发:组件化时,利用Extention(扩展)实现接口和属性的分离。

组件化过程中,如果要把某一个业务独立抽一个库出来时,可能会遇到一个情况:
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因为在Extention的头文件中定义的,所以都没有被暴露出去。
而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.引用Extention.h头文件,就可以正常使用想保护的属性或者方法了。

3.由于Extention定义的属性会在编译阶段在主类中自动生成属性三要素:实例变量,getter/setter,所以不用担心Extention定义的属性的实现问题(这一点和分类不同)。

4.别忘了Extention定义的方法,需要在主类的implemention中实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容