Расширения Objective-C
Расширение класса имеет некоторое сходство с категорией, но его можно добавить только к классу, для которого у вас есть исходный код во время компиляции (класс компилируется одновременно с расширением класса).
Методы, объявленные расширением класса, реализуются в блоке реализации для исходного класса, поэтому вы не можете, например, объявить расширение класса в классе инфраструктуры, таком как класс Какао или Какао Touch, например NSString.
Расширения - это фактически категории без названия категории. Это часто называютanonymous categories.
Синтаксис для объявления расширения использует ключевое слово @interface, как и стандартное описание класса Objective-C, но не указывает на наследование от подкласса. Вместо этого он просто добавляет круглые скобки, как показано ниже -
@interface ClassName ()
@end
Характеристики расширений
Расширение не может быть объявлено ни для одного класса, только для тех классов, которые имеют исходную реализацию исходного кода.
Расширение добавляет частные методы и частные переменные, специфичные только для класса.
Любой метод или переменная, объявленная внутри расширений, недоступна даже для унаследованных классов.
Пример расширений
Создадим класс SampleClass с расширением. В расширении у нас будет частная переменная internalID.
Затем давайте создадим метод 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
В приведенном выше примере мы видим, что внутренний идентификатор не возвращается напрямую. Здесь мы удаляем UNIQUEINTERNALKEY и делаем только оставшееся значение доступным для метода getExternalID.
В приведенном выше примере просто используется строковая операция, но он может иметь множество функций, таких как шифрование / дешифрование и так далее.