巧用 Class Extension 分离接口依赖

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 分离接口依赖)