I'm currently learning myself objective-c and iOS programming and found myself stuck with non-working code due to this subtle error for an hour. Consider the following code:
@property (strong, nonatomic) NSString *name;
- (NSString *):name { return @"Some name"; }
At first glance (and for anyone new) this looks like an overridden getter for the name
property. But theres a very subtle : that shouldn't be there. You get no warning/error from the compiler/parser/runtime here, so my question is what does this actually end up as?
I tried to figure a way of calling this method once I saw the error, but didn't succeed in my few attempts.
The method signature - (NSString *):name
breaks down to the following:
-
It is an instance method (versus a class method with a +
).(NSString *)
It returns a string.:
If you were to speak the name of this method, it would simply be called "colon". :
tells the compiler that your method accepts one parameter as well.name
There is a parameter called name. When you don't specify a type, the compiler assumes you meant id
, so this method actually fleshes out to be - (NSString *):(id)hello
A valid call to this method would be: [self :@"hello"]
.
You can do really weird things because :
is a valid name for a method, and the compiler assumes id
. You could, if you really wanted to, have a method called - :::
. The compiler would assume you meant - (id):(id):(id):(id)
, a method that returns an object of type id
and takes three parameters of type id
. You'd call it like so: [self :@"hello" :anObject :myObject];
A method declare like the one you posted is rare (and poor style, imo). Objective-C is supposed to be verbose. Methods break down like this:
-
or +
. -
means it is an instance method, +
means it is a class method.(NSString *)
.:
in it. Such as - (void) reload;
This would be a method that doesn't return a value and takes no parameters. - (NSString *) reverseString:(NSString *) stringToReverse;
In this example your method name would be reverseString:
it takes one parameter, an NSString*
that will be called stringToReverse
in the method definition.:
with no type it will be a case like - (float) addThreeValues:::
This method returns a float and takes 3 parameters. This would be an appropriate definition because the three values don't matter what order they are provided because we are just adding them.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With