類擴展與類別有一些相似之處,但它只能添加到編譯時具有源代碼的類中(類與類擴展同時編譯)。
類擴展聲明的方法是在原始類的實現塊中實現的,因此不能在框架類上聲明類擴展,例如Cocoa
或Cocoa Touch
類,如NSString
。
擴展名實際上是沒有類別名稱的類別,它通常被稱為匿名類別。
聲明擴展的語法使用@interface
關鍵字,就像標準的Objective-C類描述一樣,但不表示子類的任何繼承。 它只是添加括弧,如下所示 -
@interface ClassName ()
@end
擴展的特徵
- 不能為任何類聲明擴展,僅適用於原始實現源代碼的類。
- 擴展是添加僅特定於類的私有方法和私有變數。
- 擴展內部聲明的任何方法或變數即使對於繼承的類也是不可訪問的。
擴展示例
創建一個具有擴展名的SampleClass
類。 在擴展中,有一個私有變數internalID
。
然後,有一個方法getExternalID
,它在處理internalID
後返回externalID
。
示例代碼如下所示 -
#import <Foundation/Foundation.h>
@interface SampleClass : NSObject {
NSString *name;
}
- (void)setInternalID;
- (NSString *)getExternalID;
@end
@interface SampleClass() {
NSString *internalID;
}
@end
@implementation SampleClass
- (void)setInternalID {
internalID = [NSString stringWithFormat:
@"UNIQUEINTERNALKEY%dUNIQUEINTERNALKEY",arc4random()%100];
}
- (NSString *)getExternalID {
return [internalID stringByReplacingOccurrencesOfString:
@"UNIQUEINTERNALKEY" withString:@""];
}
@end
int main(int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass setInternalID];
NSLog(@"ExternalID: %@",[sampleClass getExternalID]);
[pool drain];
return 0;
}
執行上面示例代碼,得到以下結果:
2019-11-22 12:18:32.124 Extensions[121:313] ExternalID: 51
在上面的示例中,可以看到不直接返回internalID
。在這裏刪除了UNIQUEINTERNALKEY
,並且只為方法getExternalID
提供了剩餘的值。
上面的示例只使用字串操作,但它可以具有許多功能,如加密/解密等。
上一篇:
Objective-C Posing
下一篇:
Objective-C協議