Учебники

Расширения Objective-C

Расширение класса имеет некоторое сходство с категорией, но оно может быть добавлено только к классу, для которого у вас есть исходный код во время компиляции (класс компилируется одновременно с расширением класса).

Методы, объявленные расширением класса, реализованы в блоке реализации исходного класса, поэтому вы не можете, например, объявить расширение класса в классе платформы, таком как класс Touch Cocoa или Cocoa, например NSString.

Расширения на самом деле являются категориями без названия категории. Это часто называют анонимными категориями .

Синтаксис для объявления расширения использует ключевое слово @interface, как и стандартное описание класса Objective-C, но не указывает на какое-либо наследование от подкласса. Вместо этого он просто добавляет скобки, как показано ниже —

@interface ClassName ()

@end

Характеристики расширений

  • Расширение не может быть объявлено ни для какого класса, только для классов, которые имеют оригинальную реализацию исходного кода.

  • Расширение добавляет частные методы и частные переменные, которые относятся только к классу.

  • Любой метод или переменная, объявленная внутри расширений, недоступна даже для унаследованных классов.

Расширение не может быть объявлено ни для какого класса, только для классов, которые имеют оригинальную реализацию исходного кода.

Расширение добавляет частные методы и частные переменные, которые относятся только к классу.

Любой метод или переменная, объявленная внутри расширений, недоступна даже для унаследованных классов.

Пример расширений

Давайте создадим класс SampleClass, который имеет расширение. В расширении у нас будет приватная переменная internalID.

Затем, давайте получим метод getExternalID, который возвращает externalID после обработки internalID.

Пример показан ниже, и он не будет работать на онлайн-компиляторе.

#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.

В приведенном выше примере используется только строковая операция, но она может иметь множество функций, таких как шифрование / дешифрование и так далее.