Реализация категории в рамках реализации другого интерфейса в Obj-C - PullRequest
1 голос
/ 10 мая 2011

У меня есть собственный класс в Obj-C под названием RouteManager, который содержит массив NSStrings. Каждая строка представляет собой имя автобусной остановки, которое используется в качестве ключа для словаря, чтобы получить остальную информацию для автобусной остановки (в основном, просто [busStopDictionary allkeys]). В одной из ситуаций, когда мое приложение использует этот массив, я хочу вернуть массив, отсортированный по расстоянию от пользователя. Я начал настраивать код так, чтобы он мог вызывать sortedArrayUsingSelector для моего массива следующим методом:

- (NSComparisonResult)compareByDistance:(NSString*) otherStop
{
    // Return appropriate NSOrdered enum here based on comparison of
    // self and otherStop
}

Моя проблема заключается в том, что в случае, когда compareByDistance является методом RouteManager, self ссылается на экземпляр RouteManager. Однако мне нужно self, чтобы сослаться на строку NSString, к которой вызывается сравнение. Итак, я предположил, что мне нужно настроить категорию, как таковую:

@interface NSString (Support)
-(NSComparisonResult) compareByDistance:(NSString*)otherStop;
@end

Это дает мою собственную ссылку правильно, однако это сравнение использует значения из класса RouteManager. При реализации, как показано выше, реализация NSString (Support) явно жалуется на то, что эти значения не объявлены.

Это должно предоставить достаточно информации для моего вопроса. Как мне это сделать? Я хотел бы, чтобы моя категория NSString, которая состоит исключительно из метода compareByDistance, могла использовать значения из текущего экземпляра моего класса, RouteManager, который наследуется от NSObject. В идеале я чувствую, что категория должна каким-то образом находиться в RouteManager. Я чувствую, что должен быть какой-то способ сделать это, более чистый, чем передача необходимых значений в compareByDistance. Заранее спасибо за любую помощь.

1 Ответ

2 голосов
/ 10 мая 2011

Лучше всего было бы определить собственный класс для автобусной остановки, а не хранить их в виде строк и словарей.

Сделайте так, чтобы у класса BusStop были свойства для Имя, Местоположение и все остальное.Реализуйте метод compareByDistance: в классе BusStop.

Вы все равно можете использовать словарь, если вам нужно искать их по имени.Просто сохраните их с именем в качестве ключа словаря и объектом BusStop в качестве значения словаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...