Objective-C 扩展

  • 扩展

    扩展类别具有某些相似性,但是只能将其添加到您在编译时拥有源代码的类中(该类与该类扩展同时进行编译)。由类扩展声明的方法是在原始类的实现块中实现的,因此,例如,您不能在框架类(如NSString这样的Cocoa或Cocoa Touch类)上声明类扩展。扩展名实际上是没有类别名称的类别。它通常被称为匿名类别。声明扩展的语法使用@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;
    }
    
    编译并执行上述代码后,将产生以下结果-
    
    2020-08-21 09:07:14.900 helloWorld[7852:8336] ExternalID: 51
    
    在上面的示例中,我们可以看到internalID没有直接返回。在这里,我们删除UNIQUEINTERNALKEY,仅将剩余值提供给方法getExternalID。上面的示例仅使用字符串操作,但可以具有许多功能,如加密/解密等。