美文网首页
巧用 Class Extension 分离接口依赖

巧用 Class Extension 分离接口依赖

作者: Roy_Gao | 来源:发表于2017-02-23 17:46 被阅读34次

    Class Extension 和 Category 是我们经常使用的 Objective-C 语法:

    // Class Extension
    @interface Sark ()
    @end
    
    // Category
    @interface Sark (Gay)
    @end
    

    — 正题分割线 —

    除此之外,Class Extension 还能巧妙的解决一个接口暴露问题,若有下面的声明:

    // Sark.framework/Sark.h
    @interface Sark : NSObject
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, copy) NSString *creditCardPassword; // secret!
    @end

    // Sark.framework/PrivateSarkWife.h
    @interface PrivateSarkWife : NSObject

    • (void)robAllMoneyFromCreditCardOfSark:(Sark *)sark; // needs password!
      @end

    假设 Sark.h 是 Sark.framework 唯一暴露的 Header,而 framework 中的一个私有类需要获取这个公共类的某个属性(或方法)该怎么办?上面的 creditCardPassword 属性需要一个对外不可见而对内可见的地方声明,这时候可以利用 Class Extension:

    // Sark.h
    @interface Sark : NSObject
    @property (nonatomic, copy) NSString *name;
    @end

    // Sark+Internal.h <--- new
    @interface Sark ()
    @property (nonatomic, copy) NSString *creditCardPassword;
    @end

    // Sark.m
    /#import "Sark.h"
    /#import "Sark+Internal.h" // <--- new

    将对公业务和对私业务用 Class Extension 的形式拆到两个 Header 中,这样私有类对私有属性的依赖就被成功隔离开了:

    // PrivateSarkWife.m
    /#import "PrivateSarkWife.h"
    /#import "Sark+Internal.h" // <--- 私有依赖

    @implementation PrivateSarkWife

    • (void)robAllMoneyFromCreditCardOfSark:(Sark *)sark {
      NSString *password = sark.creditCardPassword; // oh yeah!
      }
      @end

    摘抄自 -- 孙源(sunnyxx)--[巧用 Class Extension 分离接口依赖]

    相关文章

      网友评论

          本文标题:巧用 Class Extension 分离接口依赖

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