iOS - Как создать категорию с помощью частных методов

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

Вот мой заголовок и файл реализации, который был создан при создании новой категории в 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.
}

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

"Повторяющееся определение категории на интерфейсе..."

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

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

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

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

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


person cspam    schedule 02.06.2013    source источник


Ответы (1)


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

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

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

person Martin R    schedule 02.06.2013
comment
но мне понадобятся частные объекты для управления всей работой, которую я буду выполнять в методах класса... так что, например, я знаю, что мне понадобятся два объекта NSMutableArray, может быть, другие. в этом случае мне нужно будет сохранить блок @interface...@end. В целом все остальное выглядит так, как будто оно настроено нормально? Я впервые работаю с категориями. благодаря. - person cspam; 03.06.2013
comment
@cspam: Ваш вопрос был о (частном) методе в категории, и он должен скомпилироваться, если вы удалите часть, как это предлагается в моем ответе. - Но вы не можете добавлять переменные экземпляра в категорию!!! Единственным обходным решением для этого является использование связанных объектов. См., например. stackoverflow.com/questions/13000693/ для получения дополнительной информации (но это не тривиально). - person Martin R; 03.06.2013
comment
было интересно, когда я поместил что-то в круглые скобки в интерфейсе и попытался добавить что-то вроде NSMutableArray *poly1, это дало мне ошибку компилятора, что я не мог добавить переменные экземпляра. Если я оставлю скобки пустыми, я не получу такой ошибки. однако, конечно, при попытке создать экземпляр массива это дает мне ошибку компилятора, переменная экземпляра доступна в методе класса. Просто интересно, как здесь работает компилятор. Спасибо за ссылку. Посмотрим на это. еще раз спасибо - person cspam; 03.06.2013
comment
о да, я принял. :) другое, что я могу сделать, это определить и создать экземпляры локальных объектов в моих методах класса и просто передавать указатели на эти объекты туда и обратно через другие методы класса по мере необходимости. - person cspam; 03.06.2013
comment
@cspam: Последнее замечание: с пустыми скобками @interface MKPolygon() у вас есть расширение класса, а не категория. Вы можете добавить переменные экземпляра в расширение класса, но их можно использовать только в блоке реализации класса (в данном случае MKPolygon), так что это не поможет. - person Martin R; 03.06.2013