Objective-C擴充套件


類擴充套件與類別有一些相似之處,但它只能新增到編譯時具有原始碼的類中(類與類擴充套件同時編譯)。

類擴充套件宣告的方法是在原始類的實現塊中實現的,因此不能在框架類上宣告類擴充套件,例如CocoaCocoa 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提供了剩餘的值。
上面的範例只使用字串操作,但它可以具有許多功能,如加密/解密等。