Variadic Objective-C Functions ( variable function parameters )

What are variadic functions?

Well, to be honest, I wasn’t exactly sure the name of these kinds of functions for years after I started programming. Just knowing the terminology will make your life a lot easier when googling for this same kind of thing in different programming languages.

In computer programming, a variadic function is a function of indefinite arity, i.e., one which accepts a variable number of arguments. Support for variadic functions differs widely among programming languages. (stolen from Wikipedia)

In the simplest of terms, it is a function that takes any number of arguments vs a function that takes a defined number of arguments.

iOS Library usage

There are multiple places that you run into variadic functions when doing iOS development. They are fairly simple to understand and use. The variable parameter can contain a comma seperated list of values and must be Nil terminated. Example below demonstratest creating a UIAlertView without any syntax

UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Title"
                                                message:@"Message"
                                               delegate:nil
                                      cancelButtonTitle:@"Cancel"
                                      otherButtonTitles:@"OK", @"Ignore", nil];

Implementing your own Variadic function

Using these functions is simpler than creating your own function that accepts a variable parameter. Much of the syntax and usage is inherited from C, so it may seem a little bit foreign if Objective-C is all you know. Example below demonstrates sorting any number of NSString’s.

-(NSArray*) sort:(NSString*) values, ...

    NSMutableArray* sortableItems = [[NSMutableArray alloc] init];
 
    if( values == nil )
        return sortableItems;
    
    va_list args;
    va_start(args, values);
    
    NSString* str = values;
    do
    
        [sortableItems addObject:str];
    
    while( (str = va_arg(args,NSString*)) );
    
    va_end(args);
    
    return [sortableItems sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

Explanation

The first thing to notice is the method definition. This is just syntax, but the ... signifies that this is a variable argument. The second thing is the nil check, values will always be a pointer to the first element of the variable argument, if the first element is nil we simply return an empty array.

The c-style stuff comes into play when you reach the va_list line. It is pretty simple, but you create a va_list and start reading from that list using va_start. I used a do , while loop because the va_arg function will move the pointer, and I wanted access to the first item. After you are done, of course, call va_end.

That’s all there is to making variadic functions in iOS

Source : http://www.showsites.org/sites/alexboyd.me

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s