Введение
Сегодня я проведу вас через вашу первую программу на Objective-C. Важно отметить, что я не собираюсь объяснять, как запустить этот код на любой платформе. Это Objective-C, использующий платформу Foundation, которая предоставляет такие классы, как NSString и NSLog. Позже я создам учебник о том, как запускать код Objective-C в Windows, но не на других платформах. При этом наша первая программа будет очень простой. Он будет включать два класса, один из которых будет основным классом, содержащим основной метод, а другой — классом объекта. Смысл этой программы в том, чтобы вызывать разные методы в объектном классе и из объекта этого класса для вывода разных вещей. Я также рассмотрю некоторые типичные действия программиста, такие как перебор массива.
Сначала синтаксис:
Хотя я рассмотрел общую структуру программы Objective-C, прежде чем я собираюсь более подробно остановиться на объявлении классов и методов как в файлах заголовка, так и в файлах реализации.
Как вы помните, первая строка заголовочного файла включает тег @interface и имя класса. Полный синтаксис таков:
@interface className: superClass
Это довольно очевидно. Вместо ключевого слова расширения в Java Objective-C использует ‘:’. В файле реализации все, что вам нужно в качестве первой строки, это:
@implementation headerFileClassName
Итак, если бы у меня был заголовочный файл:
@interface Box: NSObject
Реализация будет:
@implementation Box
Простой не так ли? Правильно. Обратите внимание, что теги @interface и @implementation заканчиваются тегом @end.
К методам. Обратите внимание, что знаки +- в {} означают либо то, либо другое. Я объясню их значение позже.
{+-}(returnType) methodName : (argumentType) argName partTwo: (argumentType2) argName2 ..
Это то, что вы будете писать как в файле заголовка, так и в файлах реализации, реализация будет просто иметь фактический код для метода в {} под объявлением. Методы, обозначенные знаком «+», являются статическими методами или методами уровня класса, а методы, отмеченными «-», — методами уровня экземпляра. Что действительно может сбить с толку в методах Objective-C, так это «partTwo» или joiningArgumentDescription. Эта часть объявления метода запускается вместе со всеми остальными joingingArguments и именем метода при вызове этого метода, поэтому имя метода невероятно описательно. Например, у меня есть метод экземпляра, который находит площадь коробки с заданной длиной и шириной, вот как я бы это написал:
- (double) calculateAreafromWidth: (double) w andLength: (double) l;
Таким образом, вызов метода будет
[Box calculateAreafromWidth: 5.0 andLength: 2.0];
Игнорируя грамматику, вызов метода становится очень описательным для того, что он делает.
Идем дальше. Заголовочный файл
Таким образом, только наш объектный класс будет иметь заголовочный файл, основной класс не нуждается в интерфейсе для его описания, а также не импортируется никакими другими классами. Итак, с установленным здесь мы идем:
#import <Foundation/Foundation.h> //Import the Foundation framework. @interface Speaker: NSObject //Speaker class extends NSObject. (In Java we would leave this out. The equivalent being … extends Object) //Class level/ Static method + (void) speak; //Class level hello //Instance level methods (public) - (void) hello; //Will print out Hello - (void) helloPerson :( NSString) name; //hello name - (void) helloPerson :( NSString) name withLastName: (NSString) lastName; //hello name, lastName - (void) printListByIndex; //hello: elm1, elm2, elm3, - (void) printListByEnumeration; //hello: elm1, elm2, elm3, - (void) decision: (int) num; //give 1, 2, 3 and get different things. @end
В нашем классе Speaker нет локально глобальных переменных, поэтому все, что вы видите, это методы, которые я реализую.
Файл Speaker.m
Здесь я собираюсь определить все методы, которые я объявил в заголовочном файле. Объяснения будут в коде, поэтому обязательно читайте комментарии!
#import “Speaker.h” //import Speaker header file. @implementation Speaker + (void) speak { NSLog(@”Hello”); /* THIS IS A DIRECT QUOTE. REFFERENCE IS AT BOTTOM OF THE BLOG The easiest way to create an NSString is by creating a ‘static’ instance of it using the @”…” construct. For example, NSString *name = @”Nicola”; name will point then to a ‘static’ instance of NSString containing a Unicode representation of the ASCII string Nicola. A ‘static’ instance basically means an instance which is allocated at compile time, whose instance variables are fixed, and which can never be released. REFFERENCE [1] */ } //Instance level methods (public) - (void) hello{ NSLog(@”Hello”); } - (void) helloPerson:(NSString) name;{ //hello name NSString *sentence; //Strongly typed local variable sentence = [NSString stringWithFormat: @”Hello %@ nice to meet you.”, name]; //replace %@ with name //The same thing could have been done as follows: NSLog(@”Hello %@ nice to meet you.”,name); NSLog(sentence); } - (void) helloPerson:(NSString) name withLastName: (NSString) lastName;{ //hello name, lastName NSLog(@”Hello %@ %@ nice to meet you.”,name, lastName); } - (void) printListByIndex;{ //hello: elm1, elm2, elm3, NSArray *names; names = [NSArray arrayWithObjects: @”Abe Abberly”, @”Bob Barker”, @”Carl Carsten”, nil]; //The last element of an array must be nil to denote the end. Much like how C arrays end with a null. // arrayWithObjects allows you to put Objects in an array instead of just simple data types like int. //Note arrays can hold a mix of Objects not just one kind. For example I could add an array to an array with strings in it. int i, count; //declare both i and count count = [names count]; //get the number of elements in names for (i = 0; i < count; i++) { NSLog(@”Hello %@ you are the %d person in the list”, [array objectAtIndex: i], i); } } - (void) printListByEnumeration{ //Moving through an array by index isn’t the only way. NSEnumerator *enumerator; NSObject *obj; enumerator = [array objectEnumerator]; //objectEnumerator will return a NSEnumerator which can be used to step through the array while ((obj = [enumerator nextObject]) != nil) { NSLog (@”Hello %@”, obj); } } - (void) decision: (int) num{ //give 1, 2, 3 and get different things. if(num == 1) { NSLog (@”Hello Number One. You are GOLDEN.”); } else if(num == 2) { NSLog (@”Hello Number Two. You see the SILVER lining.”); } else if (num == 3) { NSLog (@”Hello Number Three. You are looking statuesque in BRONZE.”); } else { NSLog (@”Hey I said choose a number that is 1 OR 2 OR 3"); } } @end //End implementation.
Есть реализация. Не так уж отличается от Java.
файл main.m
Вот самое интересное. У main нет заголовочного файла, потому что он не нужен, как я уже говорил ранее. Main также выглядит немного иначе, чем любой из других методов, которые мы видели. В этом файле также нет тега @implementation. Просто отпусти это, Вселенной не нужна причина.
#import <Foundation/Foundation.h> #import “Speaker.h” int main(int argc, const char * argv[]) { //Remind you of C anyone? //int argc is the number of arguments in argv //argv is a constant strongly typed char array that holds the values of the arguments passed into main. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; //Just a memory managment tool. It does wat you think it does. Speaker speaker = [[Speaker alloc] init]; //alloc allocates memory, init is the ‘constructor’ for the class [Speaker speak]; [speaker hello]; [speaker helloPerson: @”World”]; [speaker helloPerson: @”World” withLastName: @”Destruction”]; //I’m kidding /*- (void) printListByIndex; //hello: elm1, elm2, elm3, — (void) printListByEnumeration; //hello: elm1, elm2, elm3, — (void) decision: (int) num; //give 1, 2, 3 and get different things.*/ [speaker printListByIndex]; [speaker printListByEnumeration]; for(int i = 1; i <= 4; i++) { [speaker decision: i]; } [pool drain]; //release everything } @end
Там! Были сделаны! Теперь вы должны знать, как создать класс, создать экземпляр объекта и создать метод Main. В следующем блоге я расскажу о компиляции и запуске этого кода на компьютере с Windows, а также более подробно расскажу о фреймворках.
Ссылки и дополнительная литература ниже.
[1]http://www.gnustep.it/nicola/Tutorials/BasicClasses/node3.html
Дополнительная литература:
http://www.tutorialspoint.com/objective_c/objective_c_classes_objects.htm
http://www.tutorialspoint.com/objective_c/objective_c_functions.htm
http://rypress.com/tutorials/objective-c/classes
http://blog.teamtreehouse.com/beginners-guide-objective-c-classes-objects
�٥_U��