четверг, 30 июля 2015 г.

8. Словари NSDictionary

Видео с уроком находятся здесь.
В этом уроке рассказывается о словарях NSDictionary.
Есть разные способы создания словаря:

 1.  С помощью initWithObjectsAndKeys.

    NSDictionary * dictionary=[[NSDictionary alloc] initWithObjectsAndKeys:
                               @"Petrov",@"lastName",
                               @"Vasiliy",@"name",
                               [NSNumber numberWithInteger:25],@"age", nil];
   
   2. С помощью 
dictionaryWithObjectsAndKeys.

 NSDictionary * dictionary2=[NSDictionary dictionaryWithObjectsAndKeys:@"Ivanov",@"lastName", @"Petya",@"name", nil];
 

 3. С использованием литералов:
    NSDictionary * dictionary3= @{@"name":@"Alex",@"lastName":@"Pupkin",@"age":@20};

Так же можно по разному организовать вывод словаря NSDictionary:

1. С помощью objectForKey:
    NSLog(@"%@. Dictionary count=%@",dictionary3,@([dictionary3 count]));
    NSLog(@"name=%@, lastName=%@, age=%@",[dictionary objectForKey:@"name"],[dictionary objectForKey:@"lastName"],@([[dictionary objectForKey:@"age"] integerValue ]));
   

    for (NSString *key in [dictionary3 allKeys]  ) {
        id obj=[dictionary3 objectForKey:key];
        NSLog(@"Key: %@. Value: %@.",key,obj);
    }


2. С помощью литералов:
     NSLog(@"Literals print: Name:%@, lastName: %@",dictionary2[@"name"],dictionary2[@"lastName"]);






Вот кстати наткнулся на наглядные примеры литералов.




В принципе код урока весь приведен, но на всякий случай выкладываю файлы проекта.

Домашнее задание к уроку 8 NSDictionary:
Уровень Ученик

1. Создайте класс студент со свойствами имя, фамилия и фраза приветствия.
2. Создайте 10 - 15 объектов этого класса.
3. Теперь мы создадим дикшинари типо школьный журнал, где ключ будет фамилия + имя, а значение сам студент.
4. Распечатайте дикшинари

Уровень Студент.

4. В цикле пройдемся по всем ключам в дикшинари и распечатаем имя и фамилию каждого студента + его фразу приветствия.

Уровень Мастер.

5. Чтобы сделать тоже самое но по какому-то порядку, отсортируйте массив ключей по возрастанию и выведите приветствие каждого студента из дикшинари, но уже по отсортированному списку.


Выполнил все задания.
Сортировка к 5 заданию делается следующей конструкцией:
     NSArray *array=[dictionary keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2){return [[obj1 GetStudentID] compare:[obj2 GetStudentID]];}];

Исходные коды к ДЗ8 NSDictionary.


7. Протоколы

Видео урок находится здесь.
Речь в этом уроке идет про протоколы в Objective c,

Кратенький конспект (для себя).
Протокол объявляется в отдельном .h файле, который потом импортируется в нужные классы.
@protocol имя протокола <[имя родительского протокола] (опционально)>
@required - методы обязательные для реализации в классах поддерживающих протокол
@optional - методы не обязательные для реализации в классах поддерживающих протокол
 методы ...
свойства
@end


Если класс поддерживает протокол, то в объявлении добавляется:
@interface ИмяКласса: NSObject <ИмяПротокола>

Нужно самостоятельно следить, чтобы все обязательные методы и свойства протокола были реализованы в классе, который поддерживает этот протокол, т.к. в противном случае программа выдаст ошибку.
Можно сделать проверку функцией conformsToProtocol поддерживает ли объект класса все обязательные методы и свойства протокола:

if ([obj conformsToProtocol:@protocol(TAPatient)]) - объект obj реализует ли полностью протокол - TAPatient? (да,нет)

Проверить реализует ли объект опциональные (@optional) методы и свойства протокола можно функцией  respondsToSelector:
 if ([obj respondsToSelector:@selector(howIsYouJob)]) реализует ли объект obj метод howIsYouJob? (да/нет).

Файлы проекта урока 7 Протоколы

Домашнее задание к уроку 7.

Задание такое:
1. Реализуйте протоколы Jumpers, Swimmers, Runners. Каждый протокол должен иметь пару свойств, например скорость или максимальная высота прыжка и пару методов, например прыгать или плыть, нырять и тд. Включите фантазию!!!

2. Часть методов делайте обязательными (например у пловцов обязательный метод это плыть а у бегунов - бежать, логично?), а другую часть не обязательными.

3. Используйте классы из задания про массивы, там где у вас люди и животные. Например у кенгуру и у особых спортсменов реализуйте протокол Jumpers, тоже самое с другими протоколами. Пусть каждый протокол будет реализован как некоторыми классами животных, так и некоторыми классами людей.

4. Положите всех в одни массив. Тех кто прыгает заставьте прыгать и рассказывать про свои свойства. Причем у некоторых объектов пусть будут одни необязательные свойства или методы, а у других другие. Тот кто бегает пусть бегает, а тот кто плавает, пусть плавает. Тот кто ничего не делает должен быть выведен на экран как лодырь :)

5. Сделайте так чтобы один какой-то класс мог и бегать и прыгать и плавать и посмотрите как он себя поведет в цикле.

Вот  код  теста классов и протоколов (сами классы можно посмотреть в файлах проекта):
    TADog * dog=[[TADog alloc] init];
    dog.speedRunning=10;
    dog.smokerOrNotSmoker=notSmoker;
    dog.depthDiving=1;
    dog.speedSwimming=10;
   
    TABodyBilder *bilder=[[TABodyBilder alloc]init];
    bilder.speedRunning=10;
    bilder.smokerOrNotSmoker=smoker;
   
    TACat *cat=[[TACat alloc]init];
    cat.heightJump=100;
    cat.widthJump=150;
    cat.speedRunning=3;
    cat.smokerOrNotSmoker=notSmoker;
    TABaiker *baiker=[[TABaiker alloc]init];
    TASwimmer *swimmer=[[TASwimmer alloc]init];
    swimmer.heightJump=120;
    swimmer.widthJump=200;
    swimmer.depthDiving=5;
    swimmer.speedSwimming=15;
    swimmer.speedRunning=15;
    swimmer.smokerOrNotSmoker=notSmoker;
    NSArray *array=[NSArray arrayWithObjects:dog,bilder,cat,baiker,swimmer, nil];
    int count;
    for (NSObject <TARunners,TAJumpers,TASwimmers> *obj in array) {
        count=0;
        if ([obj conformsToProtocol:@protocol(TASwimmers)]) {
            [obj Swim];
         
        }
        else
        {
            count++;
        }
        if ([obj conformsToProtocol:@protocol(TARunners)]) {
            [obj Run];
           
        }
        else
        {
            count++;
        }
        if ([obj conformsToProtocol:@protocol(TAJumpers)]) {
            [obj Jump];
           
        }
        else
        {
            count++;
        }
       
        if (count==3) {
            NSLog(@"This is bummer");
        }

       
       
    }


Вот вывод:
  Dog Swim. Swimming speed: 10. Diving depth 1
 Dog Run. Run speed: 10  and no smoking
 Bodybilder Run. Run speed: 10  and smoke cigaret
 Cat Run. Run speed: 3  and no smoking
 Cat jump. Height jump: 100. Width jump: 150
 This is bummer
 Swimmer Swim. Swimming speed: 15. Diving depth 5
 Swimmer Run. Run speed: 15  and no smoking
Swimmer jump. Height jump: 120. Width jump: 200


Файлы с домашним заданием №7


6. Типы данных

Урок №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. На самом деле тут все предельно просто, но вы должны понять саму суть.


    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");
        

    }


вторник, 28 июля 2015 г.

5. Массивы (NSArray)

В этом видео уроке подробно рассматриваются массивы - используется класс NSArray.
Создание массивов с помощью initWithObjects или arrayWithObjects. Размер массива определяется свойством count класса NSArray.
Показано как обращаться к элементу массива по индексу - метод objectAtIndex или узнать индекс объекта indexOfObject.
Вывод массива обычным циклом или специальной конструкцией:
К примеру для массива NSString:
for (NSString *string in array) NSLog(string);

Так же для примера массива и использования полиморфизма был создан класс со свойством и наследник с другим свойством. Их можно хранить в одном массиве.
Так же показан метод isKindOfClass для определения к какому классу принадлежит объект.

Файлы проекта  Xcode для этого урока

Теперь домашнее задание. Я выполнил до степени зведа :)
 Уровень ученик:
(просто повторение того что увидел)

1. Создать класс "человек", который будет содержать в себе базовые качества - "имя", "рост", "вес", "пол", а также будет иметь метод "передвижение".
2. Создать дочерние классы (наследники) "велосипедист", "бегун", "пловец" и переопределить метод "передвижение" в каждом из этих классов.
3. При старте программы создать по одному объекту каждого класса и объединить их в массив.
4. В цикле пройти по всем элементам массива и вывести на экран все характеристики каждого объекта (имя, рост и тд) и у каждого вызвать метод "передвижение".

Если получилось пройти уровень ученик, то можно попробовать уровень студент:
(небольшая импровизация + дополнительная мозговая деятельность)

5. Создать еще одного наследника от класса человек, добавить в него пару новых свойств, добавить в массив и в цикле вывода вывести его свойства как дополнение к свойствам человека
6. Метод "передвижение" реализовать таким образом, чтобы перед тем как выполнить свое собственное передвижение, он выполнял передвижение реализованное в классе человек
7. Массив выводить в обратном порядке.

Уровень Мастер:
(простор для фантазии + больше мозговой деятельности + больше практики)

8. Создать класс "животное" (не наследник класса человек!) со своими собственными базовыми свойствами (отличными от человеческих) и методом "передвижение".
9. Унаследоваться от него и создать пару других классов с переопределенным передвижением.
10. Объединить всех людей и животных в один массив.
11. В цикле выводить тип объекта (человек или животное) перед тем как выводить его свойства и вызывать метод

Уровень Звезда:
(разобраться с тем чего Леша не объяснял! + реальная задача!)

12. Поместить всех людей в один массив, а животных в другой массив (количество людей и животных должно быть разное)
13. В одном цикле выводить сначала человека а потом животное, доставая данные поочередно из двух разных массивов, если в одном из массивов объектов больше, то в конце должны выводиться только объекты этого массива (так как других уже нет)

Файлы проекта ДЗ№5 Массивы

понедельник, 27 июля 2015 г.

4. @property часть 2. (strong,weak,assign,copy, atomic, nonatomic, readonly, readwrite)

Четвертый урок - продолжение рассмотрения Property. В видео уроке Properties (Part 2) 
рассматриваются такие параметры @property:
Сильная ссылка strong, которая увеличивает счетчик ссылок на объект.
 Слабая ссылка weak, которая не увиличивает счетчик ссылок, при удалении объекта становится равна nil.
assign - не увеличивает счетчик  ссылок, при удалении объекта может ссылаться на ячейку памяти, где объекта уже нет и находится  мусор. Это приводит к сбою в программе.\
Параметр strong применяется для объектов
Параметр assign для простых типов int, float и т.д.
Параметр copy копирует существующий объект и ссылается на него. Требует переопределения метода для копирования.

Параметры atomic для многопоточных приложений, nonatomic это простых.
Параметры readonly - сеттеры заблокированы, readwrite - доступны геттеры и сеттеры.

Все эти параметры  объясняются в видео на примерах. Для этого переопределен dealloc, чтобы видеть в какой момент объект уничтожается.
Исходные коды проекта

3 Property

В третьем уроке Properties (Part 1)  рассматриваются свойства Property для объектов.

Создается класс боксеров - Boxer. Объявляются свойства имя, возраст, вес и рост.
Подробно на примерах рассмотрены геттеры и сеттеры (для вывода и установки переменных/свойств), переопределены геттеры и сеттеры. Вызовы геттеров и сеттеров через точку или как обычный метод.
Рассмотрены iVar- внутренние закрытые переменные ( например _variable). Показана директива @synthesize.
Так же рассмотрены категории для инкапсуляции property внутри реализации класса.
Файлы проекта Boxer с примерами и тестами по уроку.

воскресенье, 26 июля 2015 г.

2 Methods

Во втором уроке Methods Алексей подробно рассматривает методы в Objective-c на базе Single View Application.
В начале создается родительский класс ParentClass на нем тестируются методы без параметров, с параметрами (1,2 параметра), методы которые что-то возвращают, которые ничего не возвращают.

Затем показал внутренний- скрытый метод (не объявленный в h файле).
Так же рассмотрены на примерах методы объекта (с - в начале) и метод класса (с + в начале)
Затем был создан дочерний от ParentClass - ChildClass. Протестированы вызовы методов родительского класса, переопределены методы родительского класса.
Рассмотрена инициализация (автоматически создаваемый код init). Рассмотрены указатель на себя self и указатель parent на примерах. Рассмотрена разница   self&parent для объекта и класса (методы с + и - вначале).

Файлы проекта FunctionTest в Xcode 7.

1. Xcode

В первом уроке Xcode quick intro рассказывается о среде разработки Xcode.
Alex рассказывает много важных моментов по работе в Xcode,  с которыми столкнутся все, кто начинает работать в этой среде.
В видео создается новый проект на базе стандартного шаблона Single View Application.
Объясняются значения файлов проекта, создаются кнопки в Main.storyboard.
Очень познавательное видео.

Д.З. ч.2 Указатели, Массивы.

Домашнее задание к уроку 1 часть 2  (продолжение).
Продолжаем отвечать на вопросы рассмотренные в видео  Pointers Sample.

1. Что такое указатель и зачем он нужен?

Указатель это переменная в которой хранится адрес памяти по которому расположен объект.
Указатель нужен, чтобы не перемещать,  не копировать (и т.д.) физически объект (для передачи в  функцию), а передавать функциям только адрес размещения объекта.

2. Можно ли создавать больше одного указателя на один объект?

Можно.

3. Что такое утечка памяти?

Это когда на объект не указывает указатель. В памяти образуются объекты на которые никто не указывает. Необходимо уничтожать объект перед удалением (изменением) указателя, если это не делает специальный сборщик мусора.

4. Что будет если обратиться к несуществующему объекту по старому указателю?

Ошибка. Вызовется исключение.

5. Что такое массивы?

Массив - совокупное множество однотипных переменных (объектов) обращение к переменным осуществляется через индекс.

6. Что такое многомерные массивы?
Многомерный массив - это массив, в котором каждый элемент является массивом (указателем на массив).
 

ДЗ1. Концепции ООП - инкапсуляция, наследование, полиморфизм. Классы и объекты, базовый класс

Во вступлении iOS Development Course - OOP for kids,   Алексей рассказывает на простом языке  об ООП (Объектно Ориентированное Программирование), что это такое и т.д.
Рассмотрены концепции ООП: Инкапсуляция, Наследование, Полиморфизм.

В домашнем задании к первому уроку находятся вопросы, как раз по этой теме:
1. Что такое ООП? Какой в нем смысл? Почему мы используем его а не что-то другое?
2. Что такое инкапсуляция, наследование и полиморфизм?
3. Что такое класс? Что такое объект?
4. Зачем нужен базовый родительский класс для всех объектов и нужен ли?
5. Зачем наследоваться от базового класса?
6. Как вообще полиморфизм и инкапсуляция может нам пригодиться при написании приложения?
7. Примера наследования, полиморфизма и инкапсуляции в реальной жизни.


Попробуем ответить на эти вопросы:

1. Что такое ООП? Какой в нем смысл? Почему мы используем его а не что-то другое?

Объе́ктно-ориенти́рованное программи́рование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса[1], а классы образуют иерархию наследования

 ООП - это программирование ориентированное на объект.
 Смысл заключается в упрощении задачи разработчику, сокращения времени разработки, сокращению ошибок, упрощения совместной (групповой) разработки приложений и т.д.

2. Что такое инкапсуляция, наследование и полиморфизм, абстракция данных ?

Инкапсуляция - свойство языка программирования, позволяющее объединить и защитить данные и методы в объект и скрыть реализацию объекта от пользователя. При этом пользователю предоставляется только спецификация (интерфейс) объекта.


Полиморфизм -  свойство системы, позволяющее использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Полиморфизм  - это свойство объединять объекты для каких-то целей по какому-то принципу (по родительскому признаку или по функции).  полиморфизмом называется способность функции обрабатывать данные разных типов.

Наследование - механизм языка, позволяющий описать новый класс на основе уже существующего (родительского, базового) класса или интерфейса. Потомок может добавить собственные методы и свойства, а также пользоваться родительскими методами и свойствами.

Абстракция данных  - означает выделение значимой информации и исключение из рассмотрения незначимой.

3. Что такое класс? Что такое объект?


Класс - это абстрактный тип данных (контейнер) для логически связанных данных и методов  для работы с этими данными.
Объект - экземпляр класса.


4. Зачем нужен базовый родительский класс для всех объектов и нужен ли?

5. Зачем наследоваться от базового класса?

Базовый (абстрактный) родительский класс нужен для объединения всех объектов. Это можно использовать, чтобы применять применять методы и использовать свойства базового класса ко всем объектам.


6. Как вообще полиморфизм и инкапсуляция может нам пригодиться при написании приложения? 
Данные которые изменяются инкапсулируют в отдельный класс.  Дальнейшее изменении данных или реализации не влияют на пользователя класса. Это облегчает дальнейшее сопровождение программ.
Динамически (в процессе выполнения программы) можно пользоваться объектами разных типов. При добавлении новых типов не нужно переделывать программу.

7. Примера наследования, полиморфизма и инкапсуляции в реальной жизни.

Люди наследуют гены от своих родителей.
Телега и машина "едут" по разному.
В машине реализация скрыта от водителя. Водителю доступен только интерфейс (руль, рычаги, кнопки и т.д.).

iOS Development Course

Мне попался интересный видео курс по IOS программированию от Алексея Скутаренко.
Группа в Контакте  находится посвященная курсу находится здесь:  IOS курс .
Я решил пройти этот курс и этапы выкладывать в блоге вместе с домашними заданиями.

Вступление

Здравствуйте!
Это мое первое сообщение в блоге.
В блог планирую выкладывать информацию об освоении программирования под мобильные устройства на Android и IOS.
На первых порах будет что-то вроде записной книжки для собственного контроля. Посты подробно и красочно оформлять пока не буду.