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提供了剩餘的值。
上面的示例只使用字串操作,但它可以具有許多功能,如加密/解密等。


上一篇: Objective-C Posing 下一篇: Objective-C協議