Поиск…


Синтаксис

  • @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]];


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow