Objective-C 확장
클래스 확장은 범주와 약간 유사하지만 컴파일 타임에 소스 코드가있는 클래스에만 추가 할 수 있습니다 (클래스는 클래스 확장과 동시에 컴파일 됨).
클래스 확장에 의해 선언 된 메서드는 원래 클래스의 구현 블록에서 구현되므로 예를 들어 NSString과 같은 Cocoa 또는 Cocoa Touch 클래스와 같은 프레임 워크 클래스에서 클래스 확장을 선언 할 수 없습니다.
확장자는 실제로 카테고리 이름이없는 카테고리입니다. 종종anonymous categories.
확장을 선언하는 구문은 표준 Objective-C 클래스 설명과 마찬가지로 @interface 키워드를 사용하지만 하위 클래스의 상속을 나타내지는 않습니다. 대신, 아래와 같이 괄호 만 추가합니다.
@interface ClassName ()
@end
확장의 특성
확장은 어떤 클래스에도 선언 할 수 없으며, 소스 코드의 원래 구현이있는 클래스에 대해서만 선언됩니다.
확장은 클래스에만 특정한 개인 메서드와 개인 변수를 추가합니다.
확장 내에서 선언 된 메서드 나 변수는 상속 된 클래스에서도 액세스 할 수 없습니다.
확장 예
확장이있는 SampleClass 클래스를 만들어 보겠습니다. 확장에는 private 변수 internalID가 있습니다.
그런 다음 internalID를 처리 한 후 externalID를 반환하는 getExternalID 메서드를 만들어 보겠습니다.
예제는 아래에 나와 있으며 온라인 컴파일러에서는 작동하지 않습니다.
#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 메소드에서 나머지 값만 사용할 수 있도록합니다.
위의 예는 문자열 연산 만 사용하지만 암호화 / 복호화 등과 같은 많은 기능을 가질 수 있습니다.