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:@""];
}
@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;
}
结果如下:
2022-07-07 21:18:31.754 Extensions[331:303] ExternalID: 51
在上面的实例中,我们可以看到 internalID
没有直接返回。在这里,我们删除了 UNIQUEINTERNALKEY
,并仅使剩余值可用于方法 getExternalID
。
上面的实例仅使用字符串操作,但它可以具有许多功能,如加密/解密等。