類擴充套件與類別有一些相似之處,但它只能新增到編譯時具有原始碼的類中(類與類擴充套件同時編譯)。
類擴充套件宣告的方法是在原始類的實現塊中實現的,因此不能在框架類上宣告類擴充套件,例如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
提供了剩餘的值。
上面的範例只使用字串操作,但它可以具有許多功能,如加密/解密等。