Частные методы в категории, использующие анонимную категорию - PullRequest
7 голосов
/ 25 июня 2011

Я создаю категорию поверх NSDate. У него есть несколько служебных методов, которые не должны быть частью открытого интерфейса.

Как я могу сделать их приватными?

Я склонен использовать трюк "анонимная категория" при создании закрытых методов в классе:

@interface Foo()
@property(readwrite, copy) NSString *bar;
- (void) superSecretInternalSaucing;
@end

@implementation Foo
@synthesize bar;
.... must implement the two methods or compiler will warn ....
@end

но, похоже, он не работает внутри другой категории:

@interface NSDate_Comparing() // This won't work at all
@end

@implementation NSDate (NSDate_Comparing)

@end

Какой лучший способ иметь частные методы в категории?

Ответы [ 4 ]

4 голосов
/ 25 августа 2011

Должно быть так:

@interface NSDate ()

@end

@implementation NSDate (NSDate_Comparing)

@end
2 голосов
/ 30 сентября 2013

Я думаю, что лучший способ - создать другую категорию в файле .m. Пример ниже:

APIClient + SignupInit.h

@interface APIClient (SignupInit)

- (void)methodIAddedAsACategory;
@end

и затем в APIClient + RegistrationInit.m

@interface APIClient (SignupInit_Internal)
- (NSMutableURLRequest*)createRequestForMyMethod;
@end

@implementation APIClient (SignupInit)

- (void)methodIAddedAsACategory
{
    //category method impl goes here
}
@end

@implementation APIClient (SignupInit_Internal)
- (NSMutableURLRequest*)createRequestForMyMethod
{
    //private/helper method impl goes here
}

@end
2 голосов
/ 25 июня 2011

должно быть

@interface NSDate (NSDate_Comparing)

как в @implementation. Независимо от того, поместите ли вы @interface в его собственный файл .h, решать вам, но в большинстве случаев вы хотели бы сделать это - так как вы хотите повторно использовать эту категорию в нескольких других классах / файлах.

Убедитесь, что ваши собственные методы имеют префикс, чтобы не мешать существующему методу. или возможные будущие улучшения.

0 голосов
/ 11 марта 2015

Чтобы избежать предупреждений, которые есть в других предлагаемых решениях, вы можете просто определить функцию, но не объявлять ее:

@interface NSSomeClass (someCategory) 
- (someType)someFunction;
@end

@implementation NSSomeClass (someCategory)

- (someType)someFunction
{
    return something + [self privateFunction];
}

#pragma mark Private

- (someType)privateFunction
{
    return someValue;
}

@end
...