Objective-C 扩展(Extensions)

类扩展(Extensions)与类别(Categories)有一些相似之处,但只能在编译时将其添加到具有源代码的类中(该类与类扩展同时编译)。

由类扩展声明的方法在原始类的实现块中实现,因此,例如,您不能在框架类(如 Cocoa 或Cocoa Touch 类,如 NSString)上声明类扩展。

扩展实际上是没有类别名称的类别。它通常被称为 匿名类别

声明扩展的语法使用 @interface 关键字,就像标准的 Objective-C 类描述一样,但并不表示从子类继承。相反,它只是添加了括号,如下所示

  1. @interface ClassName ()
  2. @end

扩展的特征

  • 不能为任何类声明扩展,只能为我们具有原始源代码实现的类声明扩展。
  • 扩展是添加仅特定于类的私有方法和私有变量。
  • 在扩展中声明的任何方法或变量都不能被继承类访问。

扩展的实例

让我们创建一个具有扩展名的类 SampleClass。在扩展中,让我们有一个私有变量 internalID

然后,让我们有一个方法 getExternalID,它在处理 internalID 之后返回 externalID

如下面的实例所示,这在在线编译器上不起作用。

  1. #import <Foundation/Foundation.h>
  2. @interface SampleClass : NSObject {
  3. NSString *name;
  4. }
  5. - (void)setInternalID;
  6. - (NSString *)getExternalID;
  7. @end
  8. @interface SampleClass() {
  9. NSString *internalID;
  10. }
  11. @end
  12. @implementation SampleClass
  13. - (void)setInternalID {
  14. internalID = [NSString stringWithFormat:
  15. @"UNIQUEINTERNALKEY%dUNIQUEINTERNALKEY",arc4random()%100];
  16. }
  17. - (NSString *)getExternalID {
  18. return [internalID stringByReplacingOccurrencesOfString:
  19. @"UNIQUEINTERNALKEY" withString:@""];
  20. }
  21. @end
  22. int main(int argc, const char * argv[]) {
  23. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  24. SampleClass *sampleClass = [[SampleClass alloc]init];
  25. [sampleClass setInternalID];
  26. NSLog(@"ExternalID: %@",[sampleClass getExternalID]);
  27. [pool drain];
  28. return 0;
  29. }

结果如下:

  1. 2022-07-07 21:18:31.754 Extensions[331:303] ExternalID: 51

在上面的实例中,我们可以看到 internalID 没有直接返回。在这里,我们删除了 UNIQUEINTERNALKEY,并仅使剩余值可用于方法 getExternalID

上面的实例仅使用字符串操作,但它可以具有许多功能,如加密/解密等。