Brought to you this morning by my current favorite method of caffeination:
Classes, Variables & Methods
Classes are divided into 2 parts:
@interface // definitions go here ... @implementation // goes here
Methods are defined using the syntax:
-(void) add: (int) a and: (int) b;
With the – at the start meaning an instance-level variable, and a + meaning a class level definition. Giving variables names in each method definition can feel a little strange. Heres a couple more examples:
-(void) setNumerator: (int) n overDenominator: (int) d; -(void) addEntryWithName: (*NSString) name andEmail: (*NSString) email andPhone: (*NSString) phone;
The names can also be ignored if you wish.
-(void) add: (int) a: (int) b;
Methods are invoked via the syntax:
[receiver message];
Variables can be accessed using the ‘dot operator’:
myInstance.myVar;
And can be quickly defined using the @synthesize operator, which is somewhat equivalent to Rubys attr_accessible:
@synthesis myVar;
To bring it all together:
#import <Foundation/Foundation.h> @interface Fraction : NSObject { @public int public_variable; } @property int numerator, denominator; -(void) setNumerator: (int) n andDenominator: (int) d; -(void) setA: (int) a; @end @implementation Fraction @synthesize numerator, denominator; -(void) setNumerator: (int) n andDenominator: (int) d { numerator = n; denominator = d; } -(void) setA: (int) a { public_variable = a; } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Fraction *f = [[Fraction alloc] init]; [f setNumerator: 1 andDenominator: 2]; NSLog(@"numerator: %i, denominator: %i", [f numerator], [f denominator]); [f setA: 3]; NSLog(@"via attribute accessor: %i", f->public_variable); [pool drain]; return 0; }
The ‘id’ Data Type and Static Typing
In Java if we didn’t feel like being explicit about a type, we could always just define a super-class as the reference, for example:
public class Philly { public static void main(String[] args) throws InterruptedException { Object p = new Philly(); System.out.println(p.getClass()); } }
Of course gives us the output Philly.
In Objective-C we get this weird little ‘id data type’ that can basically do the same thing. My, you are a weird little man, aren’t you ?
id g = [[Fraction alloc] init]; NSLog(@"numerator: %i, denominator: %i", [g numerator], [g denominator]);
Note that we didn’t even have to declare g as a pointer there.
Up next: Meta-data, Categories & Protocols.