Geoff Garside

Mar 26 2009

Initialising Cocoa NSValueTransformers

Just a quicky, I created my first custom Value Transformer this evening. Normally to register your transformer you have to do something like the following

+ (void)initialize
{
    [super initialize];
    [self initialiseValueTransformers];
}
+ (void)initialiseValueTransformers
{
    LoginStatusTransformer *loginStatusTransformer =
        [[[LoginStatusTransformer alloc] init] autorelease];
    [LoginStatusTransformer setValueTransformer:loginStatusTransformer
        forName:@"LoginStatusTransformer"];
}

which hurt that part of my brain which likes clean code because of all the repetition.

So I cooked up a nice little pre-processor macro to tidy it up

#define init_transformer(klass) \
    klass *vt##klass = [[[klass alloc] init] autorelease]; \
    [klass setValueTransformer:vt##klass forName:@""#klass]

so now I have

+ (void)initialiseValueTransformers
{
    init_transformer(LoginStatusTransformer);
}

which will be expanded out to

+ (void)initialiseValueTransformers
{
    LoginStatusTransformer *vtLoginStatusTransformer =
        [[[LoginStatusTransformer alloc] init] autorelease];
    [LoginStatusTransformer setValueTransformer:vtLoginStatusTransformer 
        forName:@"LoginStatusTransformer"];
}

it seems to be working for me at the moment, any bugs in the macro please let me know.

Comments
blog comments powered by Disqus