Введение

Сегодня я проведу вас через вашу первую программу на 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://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_2.html#index-classes

http://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_3.html#index-objects_002c-working-with

http://rypress.com/tutorials/objective-c/classes

http://blog.teamtreehouse.com/beginners-guide-objective-c-classes-objects

�٥_U��