2013-06-02 4 views
3

Я создаю категорию для класса MKPolygon. Вы можете найти ссылку на этот класс here. У меня есть два метода открытого класса, которые я хочу сделать «общедоступными» и несколько «частных» методов для обработки некоторых внутренних компонентов. Причина, по которой я хочу это сделать, состоит в том, что, как вы можете видеть, методы, доступные для этого класса, являются методами класса, и я хочу продолжать придерживаться этого, предлагая методы класса, которые будут возвращаться (MKPolygon *). Кроме того, будет много работы, над которой я буду писать, а не сломать задачи, будет противоречить хорошей практике кодирования и, конечно, трудно проверить и прочитать - это особенно важно, поскольку я буду способствовать этому в github.iOS - Как создать категорию с частными методами

Вот мой заголовок и файл реализации, который был создан при создании новой категории в XCode. Я собираюсь сделать методы родовыми сейчас, чтобы получить свою точку зрения:

MKPolygon + MKPolygonStuff.h

#import <MapKit/MapKit.h> 

@interface MKPolygon (MKPolygonStuff){ 

} 
+(MKPolygon *)polygon:(MKPolygon *)poly1 doStuff:(MKPolygon *)poly2 onMap:(MKMapView *)map; 
+(BOOL)polygon:(MKPolygon *)poly1 doesThisThing:(MKPolygon *)poly2; 

@end 

MKPolygon + MKPolygonStuff.m

@interface MKPolygon(){ 


} 

+(void)calculateStuff; 

@end 

@implementation MKPolygon (MKPolygonStuff) 

+(void)calculateStuff{ 



} 
+(MKPolygon *)polygon:(MKPolygon *)poly1 doStuff:(MKPolygon *)poly2 onMap:(MKMapView *)map{ 

    //do stuff and call other class methods to break up tasks 
    //[self calculateStuff]; 

} 

+(BOOL)polygon:(MKPolygon *)poly1 doesThisThing:(MKPolygon *)poly2{ 

    //returns boolean 
    //possibly call other class methods do some internals. 
} 

В моем implmentation подаст интерфейс было что-то в скобках, но оно дало мне следующее предупреждение:

«Дублирующее определение категории на terface ... "

Так что я решил, что я просто оставлю круглые скобки пустыми после прочтения здесь нескольких других тем, касающихся этой проблемы. Кроме того, это позволит мне иметь переменные экземпляра, которые мне определенно потребуются, что я не хочу быть «общедоступным».

Теперь у меня есть предупреждение, которое находится под секцией реализации рядом с + (void) calculateStuff.

«Категория реализует метод, который также будет реализован его основным классом».

Я искал это предупреждение по сети, чтобы узнать, что вызовет это предупреждение, и, похоже, вы получите это предупреждение, если компилятор узнает, что вы будете переопределять некоторые встроенные функции для класса. Дело в том, что в классе MKPolygon нет метода calculateStuff, поэтому я не уверен, почему я получаю это предупреждение. Есть ли что-то здесь, что я делаю не так, если что-нибудь и вообще, у меня есть все настроенное здесь, с тем, что я хочу сделать? Очевидно, что мои частные методы также должны быть методами класса, так как вы не можете вызвать методы экземпляра из методов класса.

Поблагодарили бы за любые комментарии/предложения/исправления.

ответ

1

Если calculateStuff - частный метод, который используется только в блоке реализации категории MKPolygon (MKPolygonStuff), то вам не нужно объявлять этот метод в интерфейсе вообще.

Просто удалите @interface MKPolygon() ... @end из "MKPolygon + MKPolygonStuff.m".

С текущими версиями Xcode/clang вам даже не требуется форвард объявлять метод, который определен и используется внутри блока реализации.

+0

, но мне нужны «частные» объекты для управления всей работой, которую я буду выполнять в методах класса ... так, например, я знаю, что мне понадобятся два объекта NSMutableArray, а может быть и другие. в этом случае мне нужно будет сохранить @interface ... @ end block. В целом все остальное выглядит так, как будто оно настроено нормально? Это моя первая работа с категориями. Благодарю. – cspam

+0

@cspam: Ваш вопрос касался (частного) * метода * в категории, и он должен быть скомпилирован, если вы удалите часть, как было предложено в моем ответе. - Но * вы не можете добавить переменные экземпляра в категорию !!! * Единственным обходным решением для этого является использование «связанных объектов». См. http://stackoverflow.com/questions/13000693/how-to-add-a-variable-to-category-in-objective-c для получения дополнительной информации (но это не тривиально). –

+0

было интересно, когда я помещал что-то в скобки в интерфейсе и пытался добавить что-то вроде NSMutableArray * poly1, он дал мне ошибку компилятора, чтобы я не мог добавлять переменные экземпляра. Если я оставлю скобки пустыми..Я не получаю такой ошибки. однако, конечно, при попытке создать экземпляр массива он дает мне ошибку компилятора «переменная экземпляра, доступная в методе класса». Просто интересно, как работает компилятор здесь. Спасибо за ссылку. Посмотрите на это. Еще раз спасибо – cspam

Смежные вопросы