views:

3954

answers:

3

Hey there, quick question here. I'm sure there's a simple answer.

Coming from PHP, I'm used to declaring a function with a default argument value like this:

function myFunction ($array, $sort = FALSE)  {

}

I the sort parameter wasn't filled, the function would continue with the default value of false. In Obj-C, is there a similar thing?

I'm working through the exercises in my "Programming In Objective-C 2.0" book, and it wants me to re-write a fraction class print function to default-ly not reduce the fraction, but if the value TRUE for reduce is given, go ahead and reduce the fraction, then print. The chapter (Nor nowhere in the book) gives any information on this.

Thanks for your help guys :D

+1  A: 

No, default arguments are a feature of C++, not C or Objective-C.

What you would have to do in objective-c is the following (using your psuedo code above):

function myFunction ($array, $sort)

function myFunction ($array)
// call myFunction($array, FALSE)
rein
actually, no you can't do that because that's also a C++-ism...
Brian Postow
+9  A: 

Default arguments don't exist in Objective-C, per se. They can't really, because the argument count is inextricably tied to the method name — each colon corresponds to one argument.

Objective-C programmers accomplish a similar goal, though, by creating "convenience" methods that just call to a more "primitive" method with some of the arguments filled in with default values. For example, -[NSArray indexOfObject:] could be implemented as version of -[NSArray indexOfObject:inRange:] with an argument of NSMakeRange(0, [self count]) for the inRange: part.

In this case, though, I don't think your book is talking about that. I think it simply means to reduce the fraction if YES is given for the reduce: argument and not reduce it if NO is given.

Chuck
+5  A: 

There are two standard patterns for achieving what you want.

(1) write a many argument form of a method and then provide fewer argument convenience versions. For example, consider the following methods on NSString:

- (NSComparisonResult)compare:(NSString *)string;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask
            range:(NSRange)compareRange;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask
            range:(NSRange)compareRange locale:(id)locale;

The first three are conceptually [and likely concretely, I didn't check] implemented as calls through to the fourth version. That, is -compare: calls -compare:options:range:locale: with appropriate default values for the three additional arguments.

(2) The other pattern is to implement the many argument version of the method and provide default values when an argument is NULL/nil or set to some value that indicates the default is desired. NSData has methods that are implemented with this pattern. For example:

+ (id)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask
            error:(NSError **)errorPtr;

If you pass 0 for the readOptionsMask argument, the NSData will read the contents of the file using an internally defined default configuration. That default configuration may change over time.

bbum