- Objective-C简介
- Objective-C开发环境设置
- Objective-C程序结构
- Objective-C基本语法
- Objective-C数据类型
- Objective-C变量
- Objective-C常量
- Objective-C运算符
- Objective-C循环
- Objective-C决策
- Objective-C函数
- Objective-C块
- Objective-C数字
- Objective-C数组
- Objective-C指针
- Objective-C字符串
- Objective-C结构体
- Objective-C预处理器
- Objective-C类型定义(typedef)
- Objective-C类型转换
- Objective-C日志处理
- Objective-C错误处理
- Objective-C命令行参数
- 高级部分
Objective-C扩展
类扩展与类别有一些相似之处,但它只能添加到编译时具有源代码的类中(类与类扩展同时编译)。
类扩展声明的方法是在原始类的实现块中实现的,因此不能在框架类上声明类扩展,例如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; }
执行上面示例代码,得到以下结果:
2019-11-22 12:18:32.124 Extensions[121:313] ExternalID: 51
在上面的示例中,可以看到不直接返回internalID
。在这里删除了UNIQUEINTERNALKEY
,并且只为方法getExternalID
提供了剩余的值。
上面的示例只使用字符串操作,但它可以具有许多功能,如加密/解密等。
下一篇:Objective-C协议
扫描二维码
程序员编程王