Class Extension 和 Category 是我們經(jīng)常使用的 Objective-C 語法:
// Class Extension
@interface Sark ()
@end
// Category
@interface Sark (Gay)
@end
— 正題分割線 —
除此之外,Class Extension 還能巧妙的解決一個(gè)接口暴露問題,若有下面的聲明:
// 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
假設(shè) Sark.h 是 Sark.framework 唯一暴露的 Header,而 framework 中的一個(gè)私有類需要獲取這個(gè)公共類的某個(gè)屬性(或方法)該怎么辦?上面的 creditCardPassword 屬性需要一個(gè)對(duì)外不可見而對(duì)內(nèi)可見的地方聲明,這時(shí)候可以利用 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
將對(duì)公業(yè)務(wù)和對(duì)私業(yè)務(wù)用 Class Extension 的形式拆到兩個(gè) Header 中,這樣私有類對(duì)私有屬性的依賴就被成功隔離開了:
// 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 分離接口依賴]