#include #include #include #include @interface Hello : NSObject + (instancetype)new; - (void)sayHello; @end @implementation Hello + (instancetype)new { return [[self alloc] init]; } - (void)sayHello { printf("Hello from Objective-C!\n"); } @end @interface ExtendedHello: Hello - (void)sayHello; - (void)baldNiko; @end @implementation ExtendedHello - (void)baldNiko { printf("67 67 bald niko 67\n"); } - (void)sayHello { [super sayHello]; [self baldNiko]; } @end @interface DoubleExtendedHello: ExtendedHello - (void)baldNiko; @end @implementation DoubleExtendedHello - (void)baldNiko { printf("bald niko with CHEESE !!!\n"); } @end @interface Player : NSObject { int x; int y; NSString *name; } - (instancetype)init; - (void)setX:(int)x; - (void)setY:(int)y; - (void)setName:(NSString *)name; - (void)sayHi; + (int)playerCount; @end @implementation Player static int playerCount = 0; - (instancetype)init { self = [super init]; if (self) { x = 0; y = 0; name = @"Player"; playerCount++; } return self; } - (void)setX:(int)val { x = val; } - (void)setY:(int)val { y = val; } - (void)setName:(NSString *)val { name = val; } - (void)sayHi { printf("Hello, I'm %s, and I am at X: %d, Y: %d!\n", [name UTF8String], x, y); } + (int)playerCount { return playerCount; } @end @interface PlayerObserver : NSObject @end @implementation PlayerObserver - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context { NSLog(@"PlayerObserver: %@ changed!", keyPath); NSLog(@"Old: %@", [change objectForKey:NSKeyValueChangeOldKey]); NSLog(@"New: %@", [change objectForKey:NSKeyValueChangeNewKey]); } @end int main(void) { @autoreleasepool { Hello *hello = [Hello new]; [hello sayHello]; NSString *string = @"Test\n"; NSLog(@"%@", string); ExtendedHello *ehello = [ExtendedHello new]; [ehello sayHello]; DoubleExtendedHello *dehello = [DoubleExtendedHello new]; [dehello sayHello]; Player *player = [Player new]; [player setName:@"John Hackclub"]; [player setX:27]; [player setY:538]; [player sayHi]; printf("player count: %d\n", [Player playerCount]); Player *player2 = [Player new]; [player2 setName:@"French Hacker"]; [player2 setX:67]; [player2 setY:41]; [player2 sayHi]; printf("player count: %d\n", [Player playerCount]); NSArray *people = @[ @"John Smith", @"Jane Doe", @"John Hackclub", @"French Hacker", @"Zach Latta" ]; NSLog(@"%@", people); NSArray *players = @[ @{@"name": @"French Hacker", @"score": @538}, @{@"name": @"Arslaan", @"score": @53827}, @{@"name": @"John Hackclub", @"score": @120} ]; NSPredicate *highScore = [NSPredicate predicateWithFormat:@"score > 300"]; NSArray *filtered = [players filteredArrayUsingPredicate:highScore]; NSLog(@"All players: %@", players); NSLog(@"High scorers (score > 300): %@", filtered); Player *player3 = [Player new]; PlayerObserver *observer = [PlayerObserver new]; [player3 addObserver:observer forKeyPath:@"name" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:NULL]; [player3 setName:@"Arslaan"]; [player3 setName:@"Arslaan Pathan"]; [player3 removeObserver:observer forKeyPath:@"name" context:NULL]; [player release]; [player2 release]; [observer release]; [player3 release]; [hello release]; [ehello release]; [dehello release]; return 0; } }