Objective-C 扩展(Extensions)
类扩展(Extensions)与类别(Categories)有一些相似之处,但只能在编译时将其添加到具有源代码的类中(该类与类扩展同时编译)。
由类扩展声明的方法在原始类的实现块中实现,因此,例如,您不能在框架类(如 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:@""];}@endint 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;}
结果如下:
2022-07-07 21:18:31.754 Extensions[331:303] ExternalID: 51
在上面的实例中,我们可以看到 internalID 没有直接返回。在这里,我们删除了 UNIQUEINTERNALKEY,并仅使剩余值可用于方法 getExternalID。
上面的实例仅使用字符串操作,但它可以具有许多功能,如加密/解密等。