Я создаю категорию для класса 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, поэтому я не уверен, почему я получаю это предупреждение. Есть ли что-то здесь, что я делаю не так, если что-нибудь и вообще, у меня есть все настроенное здесь, с тем, что я хочу сделать? Очевидно, что мои частные методы также должны быть методами класса, так как вы не можете вызвать методы экземпляра из методов класса.
Поблагодарили бы за любые комментарии/предложения/исправления.
, но мне нужны «частные» объекты для управления всей работой, которую я буду выполнять в методах класса ... так, например, я знаю, что мне понадобятся два объекта NSMutableArray, а может быть и другие. в этом случае мне нужно будет сохранить @interface ... @ end block. В целом все остальное выглядит так, как будто оно настроено нормально? Это моя первая работа с категориями. Благодарю. – cspam
@cspam: Ваш вопрос касался (частного) * метода * в категории, и он должен быть скомпилирован, если вы удалите часть, как было предложено в моем ответе. - Но * вы не можете добавить переменные экземпляра в категорию !!! * Единственным обходным решением для этого является использование «связанных объектов». См. http://stackoverflow.com/questions/13000693/how-to-add-a-variable-to-category-in-objective-c для получения дополнительной информации (но это не тривиально). –
было интересно, когда я помещал что-то в скобки в интерфейсе и пытался добавить что-то вроде NSMutableArray * poly1, он дал мне ошибку компилятора, чтобы я не мог добавлять переменные экземпляра. Если я оставлю скобки пустыми..Я не получаю такой ошибки. однако, конечно, при попытке создать экземпляр массива он дает мне ошибку компилятора «переменная экземпляра, доступная в методе класса». Просто интересно, как работает компилятор здесь. Спасибо за ссылку. Посмотрите на это. Еще раз спасибо – cspam