Введение
Сегодня я проведу вас через вашу первую программу на 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��