Язык Objective-C обладает возможностью добавлять новые методы к уже существующим классам (т.е. расширение функциональности класса). При этом не требуется исходников класса и добавленные методы автоматически становятся доступными всем классам, унаследованным от изменяемого. Так можно добавить новый метод классу NSString (возьмем за пример) и этот метод автоматически добавится во все остальные классы.
Механизм, позволяющий расширять уже существующие классы (путем добавления новых методов, новые instance-переменные добавить таким образом нельзя), называется категорией.
Категория имеет свое имя, список методов и имя класса, который она расширяет. Описание категории имеет следующий вид:
Реализация категории выглядит следующим образом:
Ограничения при создании категорий:
Механизм, позволяющий расширять уже существующие классы (путем добавления новых методов, новые instance-переменные добавить таким образом нельзя), называется категорией.
Категория имеет свое имя, список методов и имя класса, который она расширяет. Описание категории имеет следующий вид:
#import "ClassName.h"
@interface ClassName (CategoryName)
// объявление методов
@end
#import "CategoryName.h"
@implementation ClassName (CategoryName)
// реализация методов
@end
- Невозможность добавления переменных;
- Возможная коллизия имен с самим классом, поэтому необходимо использовать оригинальные префиксы в наименовании своих методов.
Пример.
Расширим класс NSString, добавим метод который будет проверять является ли файл аудио-файлом. Создадим проект Foundation и добавим в проект новый класс-категорию NSStringAudioExtension (наследуемый от NSString):
Объявим в NSStringAudioExtension.h метод - (BOOL) isAudioFile:
В NSStringAudioExtension.m реализуем метод:
Дальше возвращаемся в main.m (технически класс NSString должен подхватить его расширение):
Пример.
Расширим класс NSString, добавим метод который будет проверять является ли файл аудио-файлом. Создадим проект Foundation и добавим в проект новый класс-категорию NSStringAudioExtension (наследуемый от NSString):
Объявим в NSStringAudioExtension.h метод - (BOOL) isAudioFile:
#import <Foundation/Foundation.h>
@interface NSString (NSStringAudioExtension)
- (BOOL) isAudioFile;
@end
В NSStringAudioExtension.m реализуем метод:
#import "NSString+NSStringAudioExtension.h"
@implementation NSString (NSStringAudioExtension)
- (BOOL) isAudioFile {
if ([self hasSuffix:@".mp3"] || [self hasSuffix:@".wav"] || [self hasSuffix:@".arm"]) {
return YES;
}
return NO;
}
@end
Дальше возвращаемся в main.m (технически класс NSString должен подхватить его расширение):
#import <Foundation/Foundation.h>
#import "NSString+NSStringAudioExtension.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSString *audioFileStr = @"Scooter feat. Vicky Leandros - C'est Bleu.mp3";
if ([audioFileStr isAudioFile]) {
NSLog(@"Да, это аудио-файл");
} else {
NSLog(@"Нет, это не аудио-файл");
}
}
return 0;
}
Результат выполнения приложения:
Заменим .mp3 на .mp4, результат выполнения: