mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-12-28 09:42:35 +03:00
11 KiB
11 KiB
language | filename | contributors | translators | lang | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Objective-C | LearnObjectiveC.m |
|
|
ru-ru |
Objective-C — компилируемый объектно-ориентированный язык программирования, используемый корпорацией Apple, построенный на основе языка Си и парадигм Smalltalk. В частности, объектная модель построена в стиле Smalltalk — то есть объектам посылаются сообщения.
// Однострочный комментарий
/*
Многострочный
комментарий
*/
// Импорт файлов фреймворка Foundation с помощью #import
#import <Foundation/Foundation.h>
#import "MyClass.h"
// Точка входа в программу это функция main,
// которая возвращает целый тип integer
int main (int argc, const char * argv[])
{
// Создание autorelease pool для управления памятью
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Используйте NSLog для печати в консоль
NSLog(@"Hello World!"); // Напечатает строку "Hello World!"
///////////////////////////////////////
// Типы и переменные
///////////////////////////////////////
// Простое объявление
int myPrimitive1 = 1;
long myPrimitive2 = 234554664565;
// Помещайте * в начало названия объекта для строго типизированного объявления
MyClass *myObject1 = nil; // Строгая типизация
id myObject2 = nil; // Слабая типизация
NSLog(@"%@ and %@", myObject1, [myObject2 description]); // напечатает "(null) and (null)"
// %@ – это объект
// 'description' это общий для всех объектов метод вывода данных
// Строка
NSString *worldString = @"World";
NSLog(@"Hello %@!", worldString); // напечатает "Hello World!"
// Символьные литералы
NSNumber *theLetterZNumber = @'Z';
char theLetterZ = [theLetterZNumber charValue];
NSLog(@"%c", theLetterZ);
// Целочисленный литералы
NSNumber *fortyTwoNumber = @42;
int fortyTwo = [fortyTwoNumber intValue];
NSLog(@"%i", fortyTwo);
// Беззнаковый целочисленный литерал
NSNumber *fortyTwoUnsignedNumber = @42U;
unsigned int fortyTwoUnsigned = [fortyTwoUnsignedNumber unsignedIntValue];
NSLog(@"%u", fortyTwoUnsigned);
NSNumber *fortyTwoShortNumber = [NSNumber numberWithShort:42];
short fortyTwoShort = [fortyTwoShortNumber shortValue];
NSLog(@"%hi", fortyTwoShort);
NSNumber *fortyTwoLongNumber = @42L;
long fortyTwoLong = [fortyTwoLongNumber longValue];
NSLog(@"%li", fortyTwoLong);
// Вещественный литерал
NSNumber *piFloatNumber = @3.141592654F;
float piFloat = [piFloatNumber floatValue];
NSLog(@"%f", piFloat);
NSNumber *piDoubleNumber = @3.1415926535;
double piDouble = [piDoubleNumber doubleValue];
NSLog(@"%f", piDouble);
// BOOL (булевый) литерал
NSNumber *yesNumber = @YES;
NSNumber *noNumber = @NO;
// Массив
NSArray *anArray = @[@1, @2, @3, @4];
NSNumber *thirdNumber = anArray[2];
NSLog(@"Third number = %@", thirdNumber); // Print "Third number = 3"
// Словарь
NSDictionary *aDictionary = @{ @"key1" : @"value1", @"key2" : @"value2" };
NSObject *valueObject = aDictionary[@"A Key"];
NSLog(@"Object = %@", valueObject); // Напечатает "Object = (null)"
///////////////////////////////////////
// Операторы
///////////////////////////////////////
// Операторы работают также как в Си.
// Например:
2 + 5; // => 7
4.2f + 5.1f; // => 9.3f
3 == 2; // => 0 (НЕТ)
3 != 2; // => 1 (ДА)
1 && 1; // => 1 (логическое И)
0 || 1; // => 1 (логическое ИЛИ)
~0x0F; // => 0xF0 (побитовое отрицание)
0x0F & 0xF0; // => 0x00 (побитовое И)
0x01 << 1; // => 0x02 (побитовый сдвиг влево (на 1))
///////////////////////////////////////
// Структуры ветвления
///////////////////////////////////////
// Условный оператор
if (NO)
{
NSLog(@"I am never run");
} else if (0)
{
NSLog(@"I am also never run");
} else
{
NSLog(@"I print");
}
// Ветвление с множественным выбором
switch (2)
{
case 0:
{
NSLog(@"I am never run");
} break;
case 1:
{
NSLog(@"I am also never run");
} break;
default:
{
NSLog(@"I print");
} break;
}
// Цикл с предусловием
int ii = 0;
while (ii < 4)
{
NSLog(@"%d,", ii++); // ii++ инкрементирует ii после передачи значения
} // => напечатает "0,"
// "1,"
// "2,"
// "3,"
// Цикл со счётчиком
int jj;
for (jj=0; jj < 4; jj++)
{
NSLog(@"%d,", jj);
} // => напечатает "0,"
// "1,"
// "2,"
// "3,"
// // Цикл просмотра
NSArray *values = @[@0, @1, @2, @3];
for (NSNumber *value in values)
{
NSLog(@"%@,", value);
} // => напечатает "0,"
// "1,"
// "2,"
// "3,"
// Обработка исключений
@try
{
// Ваше исключение здесь
@throw [NSException exceptionWithName:@"FileNotFoundException"
reason:@"File Not Found on System" userInfo:nil];
} @catch (NSException * e)
{
NSLog(@"Exception: %@", e);
} @finally
{
NSLog(@"Finally");
} // => напечатает "Exception: File Not Found on System"
// "Finally"
///////////////////////////////////////
// Объекты
///////////////////////////////////////
// Создание объектов через выделение памяти и инициализацию.
// Объект не является полнофункциональным пока обе части не выполнятся.
MyClass *myObject = [[MyClass alloc] init];
// В Objective-C можель ООП базируется на передаче сообщений.
// В Objective-C Вы не просто вызваете метод; вы посылаете сообщение.
[myObject instanceMethodWithParameter:@"Steve Jobs"];
// Очищайте память, перед завершением работы программы.
[pool drain];
// Конец программы.
return 0;
}
///////////////////////////////////////
// Классы и функции
///////////////////////////////////////
// Объявляйте свой класс в файле МойКласс.h
// Синтаксис объявления:
// @interface ИмяКласса : ИмяКлассаРодителя <ИмплементируемыеПротоколы>
// {
// Объявление переменных;
// }
// -/+ (тип) Объявление метода(ов).
// @end
@interface MyClass : NSObject <MyProtocol>
{
int count;
id data;
NSString *name;
}
// При объявлении свойств сразу генерируются геттер и сеттер
@property int count;
@property (copy) NSString *name; // Скопировать объект в ходе присвоения.
@property (readonly) id data; // Генерация только геттера
// Методы
+/- (return type)methodSignature:(Parameter Type *)parameterName;
// + для методов класса
+ (NSString *)classMethod;
// - для метода объекта
- (NSString *)instanceMethodWithParameter:(NSString *)string;
- (NSNumber *)methodAParameterAsString:(NSString*)string andAParameterAsNumber:(NSNumber *)number;
@end
// Имплементируйте методы в файле МойКласс.m:
@implementation MyClass
// Вызывается при высвобождении памяти под объектом
- (void)dealloc
{
}
// Конструкторы – это способ осздания объектов класса.
// Это обычный конструктор вызываемый при создании объекта клсааа.
- (id)init
{
if ((self = [super init]))
{
self.count = 1;
}
return self;
}
+ (NSString *)classMethod
{
return [[self alloc] init];
}
- (NSString *)instanceMethodWithParameter:(NSString *)string
{
return @"New string";
}
- (NSNumber *)methodAParameterAsString:(NSString*)string andAParameterAsNumber:(NSNumber *)number
{
return @42;
}
// Методы объявленные в МyProtocol (см. далее)
- (void)myProtocolMethod
{
// имплементация
}
@end
/*
* Протокол объявляет методы которые должны быть имплементированы
* Протокол не является классом. Он просто определяет интерфейс,
* который должен быть имплементирован.
*/
@protocol MyProtocol
- (void)myProtocolMethod;
@end
На почитать
iOS For High School Students: Getting Started