Урок №6 находится здесь.
В этом уроке рассматриваются примитивные типы:
BOOL - булевые (YES/NO)
NSInteger - целые числа, аналог Int
NSUInteger - беззнаковые целые числа, аналог unsigned int.
CGFloat (Требуется подключить библиотеку UIKit/UIKit.h) - числа с запятой, аналог float.
double - числа с запятой, под хранение используется больше памяти, чем в float.
Объясняется что делает typedef, он служит для создания новых типов данных (заменяет одну последовательность символов на другую).
Рассмотрено отличие переменных с примитивными типами и указателями на переменные/объекты.
Рассмотрена операция & взятие адреса и обращение по указателю *point.
Так же рассмотрены enum списки:
typedef enum {список значений, через запитую} Название списка.
Так же рассмотрены структуры CGPoint - описывающая точку, которые соответственно хранят две координаты x,y:
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
Структура CGSize, хранит размер прямоугольника width и height (ширина, высота):
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
Структура CGRect объединяет CGPoint и CGSize:
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
Рассмотрены инициализаторы для CGPoint: CGPoint point= CGPointMake(2.3f, 1.5f);
Для CGRect есть например такой инициализатор: CGRectMake(3, 2, 5, 5);
Примитивные типы и структуры не являются объектами и тем более потомками главного класса NSObject, поэтому их напрямую нельзя поместить в массив NSArray.
Для того, чтобы помещать примитивные типы в массив используется класс NSNumber. Он создает оболочку над переменной. В таком виде уже можно переменную вставлять в массив NSArray.
Используется конструкция типа:
NSNumber * boolObject=[NSNumber numberWithBool:boolVar];
Это для BOOL переменных.
Для других соответственно:
numberWithInteger, numberWithUnsignedInteger, numberWithFloat, numberWithDouble.
Чтобы извлечь из оболочки переменную необходимо посылать сообщения оболочке:
[boolObject boolValue].
Для других типов соответственно:
integerValue, unsignedIntegerValue,floatValue], doubleValue.
Структуры CGPoint, CGRect, CGSize так же не являются наследниками NSObject, поэтому для того, чтобы внести их в массив NSArray применяется класс NSValue и сообщение valueWithCGPoint:
NSArray *array2 = [NSArray arrayWithObjects:[NSValue valueWithCGPoint:point1],[NSValue valueWithCGPoint:point2],nil];
Для того, чтобы извлечь из оболочки NSValue применяется сообщение CGPointValue:
CGPoint p=[obj CGPointValue];
Так же есть функция NSStringFromCGPoint для преобразования CGPoint в строку (для вывода): NSLog(NSStringFromCGPoint(p));
Так же рассмотрена функция BOOL result CGRectContainsPoint(rect,point) она сообщает поподает ли точка point в квадрат rect.
Файлы проекта с уроком 6 Типы данных
Домашнее задание к уроку № 6.
1. Я очень хочу чтобы вы попрактиковались создавать и использовать enum списки. Они ОЧЕНЬ распространены, они делают код красивее и вносят дополнительную информацию. Это просто очень хорошая практика их использовать! Практикуйтесь! Создайте кучу разных пропертей под разные энумы. Постарайтесь усвоить это сразу.
2. Надо попрактиковаться со структурами. Например такое небольшое задание:
на поле 10х10 рандомно создайте точек (разберитесь как рандомно генерировать цифры, подсказка - функция arc4random()) и проверяйте какая из точек попадает в квадрат размером 3х3 в самом центре поля. Грубо говоря надо определить какие из точек в массиве попадают в центр и вывести их на печать. Пробуйте и задавайте вопросы.
3. Разберитесь с оболочками NSNumber и NSValue. На самом деле тут все предельно просто, но вы должны понять саму суть.
В этом уроке рассматриваются примитивные типы:
BOOL - булевые (YES/NO)
NSInteger - целые числа, аналог Int
NSUInteger - беззнаковые целые числа, аналог unsigned int.
CGFloat (Требуется подключить библиотеку UIKit/UIKit.h) - числа с запятой, аналог float.
double - числа с запятой, под хранение используется больше памяти, чем в float.
Объясняется что делает typedef, он служит для создания новых типов данных (заменяет одну последовательность символов на другую).
Рассмотрено отличие переменных с примитивными типами и указателями на переменные/объекты.
Рассмотрена операция & взятие адреса и обращение по указателю *point.
Так же рассмотрены enum списки:
typedef enum {список значений, через запитую} Название списка.
Так же рассмотрены структуры CGPoint - описывающая точку, которые соответственно хранят две координаты x,y:
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
Структура CGSize, хранит размер прямоугольника width и height (ширина, высота):
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
Структура CGRect объединяет CGPoint и CGSize:
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
Рассмотрены инициализаторы для CGPoint: CGPoint point= CGPointMake(2.3f, 1.5f);
Для CGRect есть например такой инициализатор: CGRectMake(3, 2, 5, 5);
Примитивные типы и структуры не являются объектами и тем более потомками главного класса NSObject, поэтому их напрямую нельзя поместить в массив NSArray.
Для того, чтобы помещать примитивные типы в массив используется класс NSNumber. Он создает оболочку над переменной. В таком виде уже можно переменную вставлять в массив NSArray.
Используется конструкция типа:
NSNumber * boolObject=[NSNumber numberWithBool:boolVar];
Это для BOOL переменных.
Для других соответственно:
numberWithInteger, numberWithUnsignedInteger, numberWithFloat, numberWithDouble.
Чтобы извлечь из оболочки переменную необходимо посылать сообщения оболочке:
[boolObject boolValue].
Для других типов соответственно:
integerValue, unsignedIntegerValue,floatValue], doubleValue.
Структуры CGPoint, CGRect, CGSize так же не являются наследниками NSObject, поэтому для того, чтобы внести их в массив NSArray применяется класс NSValue и сообщение valueWithCGPoint:
NSArray *array2 = [NSArray arrayWithObjects:[NSValue valueWithCGPoint:point1],[NSValue valueWithCGPoint:point2],nil];
Для того, чтобы извлечь из оболочки NSValue применяется сообщение CGPointValue:
CGPoint p=[obj CGPointValue];
Так же есть функция NSStringFromCGPoint для преобразования CGPoint в строку (для вывода): NSLog(NSStringFromCGPoint(p));
Так же рассмотрена функция BOOL result CGRectContainsPoint(rect,point) она сообщает поподает ли точка point в квадрат rect.
Файлы проекта с уроком 6 Типы данных
Домашнее задание к уроку № 6.
1. Я очень хочу чтобы вы попрактиковались создавать и использовать enum списки. Они ОЧЕНЬ распространены, они делают код красивее и вносят дополнительную информацию. Это просто очень хорошая практика их использовать! Практикуйтесь! Создайте кучу разных пропертей под разные энумы. Постарайтесь усвоить это сразу.
2. Надо попрактиковаться со структурами. Например такое небольшое задание:
на поле 10х10 рандомно создайте точек (разберитесь как рандомно генерировать цифры, подсказка - функция arc4random()) и проверяйте какая из точек попадает в квадрат размером 3х3 в самом центре поля. Грубо говоря надо определить какие из точек в массиве попадают в центр и вывести их на печать. Пробуйте и задавайте вопросы.
3. Разберитесь с оболочками NSNumber и NSValue. На самом деле тут все предельно просто, но вы должны понять саму суть.
CGRect korabl=CGRectMake(4, 4, 3, 3);
CGPoint point;//=CGPointMake(1, 1);
NSValue *value;//=[NSValue valueWithCGPoint:point];
NSMutableArray *array=[[NSMutableArray alloc]init];
// NSArray *array=[[NSArray alloc] initWithObjects:NSValue count:20];
NSLog(@"Generating random CGPoint");
for (int i=0; i<10; i++) {
point=CGPointMake(arc4random()%10+1, arc4random()%10+1);
value=[NSValue valueWithCGPoint:point];
[array addObject:value];
NSLog(@"%@. %@",@(i),NSStringFromCGPoint(point));
}
NSLog(@"Hit testing");
for (int i=0; i<10; i++) {
value=array[i];
point=[value CGPointValue];
BOOL result=CGRectContainsPoint(korabl, point);
NSLog(@"%@. Point: %@ %@ the ship",@(i),NSStringFromCGPoint(point),(result==YES)?@"HIT":@"Misses");
}
Комментариев нет:
Отправить комментарий