Objective-C основы подклассификации, как добавить настраиваемое свойство;

У меня возникла проблема с подклассом MKPolygon.

Я хочу добавить простое свойство int tag, но я продолжаю получать экземпляр MKPolygon вместо моего пользовательского класса, поэтому вызов setTag: вызывает исключение.

Проблема в том, что MKPolygons создаются с использованием метода класса: polygonWithCoordinates: count:, и я не знаю, как превратить это в экземпляр моего класса (который включает свойство тега).

Как вы могли бы добавить свойство тега в MKPolygon?

Спасибо!

Ответ 1

Вы должны использовать категорию (как предлагает @Seva) и objc_setAssociatedObject (как предлагает @hoha).

@interface MKPolygon (TagExtensions)
@property (nonatomic) int tag;
@end

@implementation MKPolygon (TagExtensions)
static char tagKey;

- (void) setTag:(int)tag {
    objc_setAssociatedObject( self, &tagKey, [NSNumber numberWithInt:tag], OBJC_ASSOCIATION_RETAIN );
}

- (int) tag {
    return [objc_getAssociatedObject( self, &tagKey ) intValue];
}

@end

Вы также можете посмотреть раздел Ассоциативные ссылки в руководстве ObjC, в дополнение к API @hoha, связанному с.

Ответ 2

Похоже, что разработчики MKPolygon не сделали его наследованием дружественным. Если вы хотите добавить несколько тегов в эти экземпляры, вы можете

1) держите карту (NSDictionary или CFDictionary) от MKPolygon адресов экземпляров к тегам. Это решение работает хорошо, если все теги требуются в том же классе, который они установлены.

2) использовать среду выполнения для непосредственного прикрепления тега к многоугольникам - objc_setAssociatedObject (Objective-C Ссылка на время работы)

Ответ 3

У меня такая же проблема. Простое решение - просто использовать свойство Title для MKPolygon, чтобы сохранить то, что вы сохраните в теге. По крайней мере, в моем случае, когда мне не нужна ссылка на объект, но простое число, оно работает

Ответ 4

SpecialPolygon *polygon = [SpecialPolygon polygonWithCoordinates:count:];
[polygon setInt: 3];

Ключ состоит в том, что с помощью метода SpecialPolygon factory вместо MKPolygon one вы получите желаемый подкласс SpecialPolygon.

Ответ 5

Вы говорите о MKPolygons, созданных вашим кодом, или в другом месте? Если первый, просто переопределите метод polygonWithStuff. Если последнее, рассмотрим категорию над М.К.Полигоном. Тогда все MKPolygons в вашем проекте будут иметь тег в них.

Ответ 6

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

http://en.wikipedia.org/wiki/Object_composition