Objective-C function with default parameters?

64,632

Solution 1

There's no default parameters in ObjC.

You can create 2 methods though:

-(void)fooWithA:(int)a b:(int)b c:(int)c {
  ...
}
-(void)fooWithA:(int)a b:(int)b {
  [self fooWithA:a b:b c:0];
}

For C : there's nothing special added to the C subset by using ObjC. Anything that cannot be done in pure C can't be done by compiling in ObjC either. That means, you can't have default parameters, nor overload a function. Create 2 functions instead.

Solution 2

No, objective-c does not support default parameters. See similar question

Solution 3

You can write a C function with a variable length argument list. You can use '...' as the data type for one of your function's declared parameters to specify where in the parameter list the variable argument list begins. (That allows you to have one or more required arguments before the start of the list.)

printf() is an example of a function that is written using this facility (known as varargs).

printf(const char *restrict format, ...);

Here, the first argument is required, and then can be followed by zero or more additional arguments.

If you wrote your function this way, it could supply a default value for the missing parameter.

Solution 4

For a C function - no. For an Objective C class method - yes, you just do two methods, one of them one parameter short, calling the other method.

Or you can rename your sources to .mm and C functions magically become C++.

Share:
64,632
Brian Postow
Author by

Brian Postow

Updated on July 09, 2022

Comments

  • Brian Postow
    Brian Postow almost 2 years

    Possible Duplicates:
    Optional arguments in Objective-C 2.0?
    Objective-C Default Argument Value

    I'm writing a C function in Objective-C. I want a default value for my last parameter.

    I've tried:

    foo(int a, int b, int c = 0);
    

    but that's C++.

    I've also tried:

    foo(int a, int b, int c)
    {
        ...
    }
    
    foo(int a, int b)
    {
       foo(a, b, 0);
    }
    

    But that's also C++.

    Is there a way to do this in Objective-C instead?

  • Brian Postow
    Brian Postow about 14 years
    @Kenny, yeah but this doesn't really belong to any class. it really is a stand alone C function...
  • Brian Postow
    Brian Postow about 14 years
    That's an interesting possibility... I'll have to figure out the cost of that in other parts of my integration...
  • Macmade
    Macmade about 14 years
    Then as Seva sugest, try Objective-C++. With that, you will be able to mix C++ and Obj-C code, calling one from the other, etc... : )
  • Seva Alekseyev
    Seva Alekseyev about 14 years
    Note that this changes global name decoration. You won't be able to call such a function externally from a .m/.c source; if there's a way to declare a function as "extern C++", so to say, I'm not familiar with it. In other words, if you're going ObjC++, you better do this throughout the project.
  • Necktwi
    Necktwi about 7 years
    I have changed header file extension to hh, source file extension to mm and In project settings it is set compile source as according to file type extension to compile it as objective-C++. but still it says C does not support default arguments. what is the correct extension for objective-C++ header files?
  • kennytm
    kennytm about 7 years
    @neckTwi mm. However, the error may happen if the hh is included by non-ObjC++ files.
  • Necktwi
    Necktwi about 7 years
    I have a C++ function NormalSmooth declared in file nautical.hpp and defined in nautical.cpp which I have renamed to nautical.hh and nautical.mm respectively. Now I am using the function NormalSmooth in GameViewController.m. What should I do to avoid the above error? Thank you.
  • kennytm
    kennytm about 7 years
    @neckTwi change GameViewController to mm as well. (Consider create a new question post)
  • Necktwi
    Necktwi about 7 years
    Done. Please look into stackoverflow.com/questions/43268483/… thank you
  • Motti Shneor
    Motti Shneor about 5 years
    God forbid!!! making it Objective-C++ you'll bare the curse of C++ forever. E.g. you cannot deploy your binary to others, because they'll need to compile their own code EXACTLY the same way you did. Same compiler, runtime-libs and settings. C++ has no standard/consistent ABI. The strongest reason OBJ-C is "pure C" - is to have a "compatible-forever" binary, that runs everywhere. You only use Obj-C++ when you need to interface C++ code from Obj-C. Certainly not to save a few simple-to-understand code-lines. If you're all for elegance - do Swift instead (and enjoy same perils as C++)