Objective-C Language
категории
Поиск…
Синтаксис
@interface ClassName (categoryName) // ClassName - это класс, который должен быть расширен
// Объявления метода и свойств
@конец
замечания
Чтобы избежать столкновений с именами методов, рекомендуется использовать префиксы (например, xyz_
в примере). Если существуют методы с тем же именем, это не определено, какой из них будет использоваться во время выполнения.
Простая категория
Интерфейс и реализация простой категории на NSArray с именем Filter с единственным методом, который фильтрует числа.
Хорошей практикой является добавление префикса ( PF
) к методу, чтобы гарантировать, что мы не перезаписываем какие-либо будущие методы NSArray
.
@interface NSArray (PFFilter)
- (NSArray *)pf_filterSmaller:(double)number;
@end
@implementation NSArray (PFFilter)
- (NSArray *)pf_filterSmaller:(double)number
{
NSMutableArray *result = [NSMutableArray array];
for (id val in self)
{
if ([val isKindOfClass:[NSNumber class] && [val doubleValue] >= number)
{
[result addObject:val];
}
}
return [result copy];
}
@end
Объявление метода класса
Заголовочный файл UIColor+XYZPalette.h
:
@interface UIColor (XYZPalette)
+(UIColor *)xyz_indigoColor;
@end
и реализация UIColor+XYZPalette.m
:
@implementation UIColor (XYZPalette)
+(UIColor *)xyz_indigoColor
{
return [UIColor colorWithRed:75/255.0f green:0/255.0f blue:130/255.0f alpha:1.0f];
}
@end
Добавление свойства с категорией
Свойства могут быть добавлены с категориями с использованием связанных объектов, особенностью среды выполнения Objective-C.
Обратите внимание, что объявление свойства retain, nonatomic
соответствует последнему аргументу objc_setAssociatedObject
. См. « Прикрепить объект» к другому существующему объекту для объяснений.
#import <objc/runtime.h>
@interface UIViewController (ScreenName)
@property (retain, nonatomic) NSString *screenName;
@end
@implementation UIViewController (ScreenName)
@dynamic screenName;
- (NSString *)screenName {
return objc_getAssociatedObject(self, @selector(screenName));
}
- (void)setScreenName:(NSString *)screenName {
objc_setAssociatedObject(self, @selector(screenName), screenName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
Соответствует протоколу
Вы можете добавлять протоколы к стандартным классам, чтобы расширить их функциональность:
@protocol EncodableToString <NSObject>
- (NSString *)toString;
@end
@interface NSDictionary (XYZExtended) <EncodableToString>
@end
@implementation NSDictionary (XYZExtended)
- (NSString *)toString {
return self.description;
}
@end
где XYZ
префикс вашего проекта
Создать категорию на XCode
Категории предоставляют возможность добавлять дополнительные функции к объекту без подкласса или изменения фактического объекта.
Например, мы хотим установить некоторые пользовательские шрифты. Давайте создадим категорию, добавляющую функциональность в класс UIFont
. Откройте проект XCode, щелкните File
-> New
-> File
и выберите File
Objective-C file
, нажмите «Далее», введите название своей категории, произнесите «CustomFont», выберите тип файла как категорию и класс как UIFont, затем нажмите «Далее», а затем «Создать». "
Объявить метод категории: -
Нажмите «UIFont + CustomFonts.h», чтобы просмотреть заголовочный файл новой категории. Добавьте следующий код в интерфейс для объявления метода.
@interface UIFont (CustomFonts)
+(UIFont *)productSansRegularFontWithSize:(CGFloat)size;
@end
Теперь выполните метод категории: -
Нажмите «UIFont + CustomFonts.m», чтобы просмотреть файл реализации категории. Добавьте следующий код для создания метода, который будет устанавливать ProductSansRegular Font.
+(UIFont *)productSansRegularFontWithSize:(CGFloat)size{
return [UIFont fontWithName:@"ProductSans-Regular" size:size];
}
Импортируйте свою категорию
#import "UIFont+CustomFonts.h"
Теперь установите шрифт Label
[self.label setFont:[UIFont productSansRegularFontWithSize:16.0]];