扩展(Extensions)
优质
小牛编辑
130浏览
2023-12-01
类扩展与类别有一些相似之处,但它只能添加到编译时具有源代码的类中(类与类扩展同时编译)。
类扩展声明的方法是在原始类的实现块中实现的,因此您不能在框架类上声明类扩展,例如Cocoa或Cocoa Touch类,如NSString。
扩展名实际上是没有类别名称的类别。 它通常被称为anonymous categories 。
声明扩展的语法使用@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;
}
现在,当我们编译并运行程序时,我们将得到以下结果。
2013-09-22 21:18:31.754 Extensions[331:303] ExternalID: 51
在上面的示例中,我们可以看到不直接返回internalID。 我们在这里删除了UNIQUEINTERNALKEY,并且只为方法getExternalID提供了剩余的值。
上面的示例只使用字符串操作,但它可以具有许多功能,如加密/解密等。