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