Добавьте атрибут target @property в target-c - PullRequest
2 голосов
/ 12 мая 2010

Кто-нибудь знает способ добавления дополнительных типов атрибутов к ключевому слову @property без изменения компилятора? Или кто-нибудь может придумать другой способ обобщить создание геттера / сеттера?

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

Например, если бы у меня был объект с массивом песен, я бы написал геттер, как показано ниже:

- (NSMutableArray *)songs {
    if (!songs) {
        songs = [[NSMutableArray alloc] init];
    }

    return songs;
}

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

@property (nonatomic, retain, lazyGetter) NSMutableArray *songs;

Может быть, какие-нибудь причудливые трюки через #defines или что-то в этом роде? Другие идеи?

1 Ответ

4 голосов
/ 12 мая 2010

Вы всегда можете использовать макросы. Даже если вы изменили компилятор, вы, вероятно, все равно захотите сделать это в @synthesize вместо @property, поскольку нет необходимости публиковать эту информацию о реализации. А с макросом легко использовать любой метод init. К сожалению, макросы не знают атрибута getter = property.

#define synthesizeLazyGetterWithInit(PROPERTY,TYPE,INIT)\
-(TYPE *) PROPERTY { if ( !PROPERTY ) { PROPERTY=[[TYPE alloc] INIT]; } return PROPERTY; }

#define synthesizeLazyGetter(PROPERTY,TYPE)\
synthesizeLazyGetterWithInit(PROPERTY,TYPE,init)

@implementation MyClass

synthesizeLazyGetter(songs,NSMutableArray)
synthesizeLazyGetterWithInit(other,NSMutableArray,initWithCapacity:0)

@end

Edit:

#define synthesizeLazyGetterOptional(PROPERTY,TYPE,INIT);\
-(TYPE *) PROPERTY:(BOOL)inAllocate { if ( !PROPERTY && inAllocate ) { PROPERTY=[[TYPE alloc] INIT]; } return PROPERTY; }\
-(TYPE *) PROPERTY { return [self PROPERTY:YES]; }\
-(BOOL) PROPERTY##Initialized { return nil != PROPERTY; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...