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 分离接口依赖]
网友评论