美文网首页iOS 开发每天分享优质文章
iOS开发:组件化时,利用Extention(扩展)实现接口分离

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

作者: jlstmac | 来源:发表于2023-04-10 20:07 被阅读0次

    组件化过程中,如果要把某一个业务独立抽一个库出来时,可能会遇到一个情况:
    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头文件,就可以正常使用想保护的属性或者方法了。

    相关文章

      网友评论

        本文标题:iOS开发:组件化时,利用Extention(扩展)实现接口分离

        本文链接:https://www.haomeiwen.com/subject/ipewddtx.html