牲多壮志,敢教日月换新天。为有牺

[Objective-C语言教程]扩展(30)

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

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

类扩展声明的方法是在原始类的实现块中实现的,因此不能在框架类上声明类扩展,例如CocoaCocoa Touch类,如NSString

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

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

@interface ClassName ()

@end

扩展的特征

  • 不能为任何类声明扩展,仅适用于原始实现源代码的类。
  • 扩展是添加仅特定于类的私有方法和私有变量。
  • 扩展内部声明的任何方法或变量即使对于继承的类也是不可访问的。

扩展示例

创建一个具有扩展名的SampleClass类。 在扩展中,有一个私有变量internalID
然后,有一个方法getExternalID,它在处理internalID后返回externalID

示例代码如下所示 -

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

执行上面示例代码,得到以下结果:

2019-11-22 12:18:32.124 Extensions[121:313] ExternalID: 51

在上面的示例中,可以看到不直接返回internalID。在这里删除了UNIQUEINTERNALKEY,并且只为方法getExternalID提供了剩余的值。

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

posted @   为敢技术  阅读(130)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示