пятница, 15 февраля 2013 г.

Урок 8. Как программировать на iOS - О языке Objective-C. Часть 2

Приветы!

Продолжаем наши уроки.
В прошлый раз мы говорили об основах языка Objective-C и о том, что такое объект и класс.

Сегодня мы узнаем о наследовании и научимся создавать свои классы.


Наследование

Как мы помним, есть понятие класса. Класс - это концепция, описывающая совокупность объектов с одинаковым набором свойств и методов. Например, класс кнопок - у всех кнопок есть надпись, ширина, высота (свойства) и "нажать", "нарисовать себя" (методы).
Соответственно, каждая кнопка - это объект класса "кнопка".
Если брать примеры из реальной жизни, то есть класс "легковая машина", например.

Это, надеюсь, вы помните с прошлого урока :)
Теперь давайте посмотрим на два объекта - на кнопку и на текстовое поле.
Хотя они и предназначены для разных вещей, имеют разные наборы методов и свойств, но в чем-то они похожи. Например, и у кнопки, и у текстового поля есть координаты на экране, их ширина и высота, они оба реагируют на нажатия.
Если обратиться к реальной жизни, то можно вспомнить легковую и грузовую машины. Безусловно, они предназначены для разных целей, но у них есть схожие черты и методы.
Обе машины - легковую и грузовую - можно назвать общим словом "машина".
По сути, мы можем сказать, что есть общий класс "машина", а есть более конкретные классы (легковая машина, грузовая машина). У общего класса "машина" есть некоторые сходства с мотоциклом и с моторной лодкой (и то, и другое, и третье используются для передвижения человека в пространстве с использованием мотора). Это значит, что у этих трех классов есть более общий класс "транспортное средство".
Это и есть наследование - каждый более конкретный класс содержит в себе свойства более общего класса (легковой автомобиль есть машина, машина есть транспортное средство), при этом конкретный класс добавляет свои свойства (легковой автомобиль = машина + небольшой размер, машина = транспортное средство + сухопутное + на четырех колесах).

Аналогично и для кнопки и текстового поля - и то, и другое наследуются от общего класса "элемент управления" (UIControl), тот в свою очередь является предком "вида" UIView. Вид - это просто прямоугольное пространство на экране, которое может быть отображено и которое содержит в себе другие элементы.

В Objective-C построена очень большая иерархия классов. Если спускаться от самых конкретных (от той же кнопки UIButton), вниз, к более общим, то в самом низу мы встретимся с базовым классом, который называется NSObject.
Любой класс наследуется от него. 

Наш собственный класс

Для создания класса, нажмите правой кнопкой на группе, в которую хотите его поместить и выберите New File:
Выбираем Cocoa Touch - Objective-C class:
Введите название, я выбрал "MyClass", в строке Subclass of (наследник какого класса) выбираем NSObject - будем наследоваться от самого базового класса.


Выбираем папку для сохранения файла и он появляется у нас:

Отлично.

Теперь о файлах .h и .m.

Файл myclass.h называется заголовочным файлом (header, хэдер) - в нем хранится информация о классе, а именно: его список свойств и методов, доступных другим классам.

У нас он содержит следующие строки:

#import <Foundation/Foundation.h>

@interface MyClass : NSObject

@end


Это - базовое объявление класса. Первая строка означает, что мы импортируем классы Foundation - по сути, все основные классы Objective-C типа строк, чисел и т.д. содержатся там.

Далее, мы объявляем интерфейс - то есть список доступных методов и свойств нашего класса - ключевым словом @interface и пишем название класса MyСlass, а через двоеточние - название класса, от которого наследуемся.

@end, как не сложно догадаться, завершает описание интерфейса.
Давайте сделаем что-нибудь простое. Например, пусть у нашего класса будет свойство "описание", в котором мы будем хранить его текстовое описание + у него будет метод "поздороваться", который будет выводить в консоль сообщение "Hello, World!".
Не густо, но для начала пойдет :)

Добавим в интерфейс описание метода и свойства:

#import <Foundation/Foundation.h>

@interface MyClass : NSObject

-(void)sayHi;
@property (nonatomic, retain) NSString *myText;

@end

Вот так.
Сначала мы объявили метод sayHi, который будет печатать сообщение Hello, world.

Напомню, что, поскольку он не принимает никаких параметров, то двоеточий в нем нет. И, поскольку он не возвращает никаких данных, то мы пишем -(void) перед началом метода.

Далее идет объявление свойства.
Пока что мы не будем подробно разбирать его - достаточно сказать, что у нас есть объект класса строка (NSString), на который будет ссылаться указатель под названием myText.

Давайте заглянем в MyClass.m:

#import "MyClass.h"

@implementation MyClass

@end

Не густо :) Первая строка указывает на описание класса, находящееся в хэдера.
А далее мы пишем @implementation, чтобы показать, что тут будет код методов.

Изменим его, чтобы он выглядел следующим образом:
#import "MyClass.h"

@implementation MyClass
@synthesize myText;

-(void)sayHi
{
    NSLog(@"Hello, world!");
}
@end

Про @synthesize мы пока говорить не будем, разве что вкратце скажу - он вместо нас генерирует код, который позволит другим объектам "читать" содержимое строки myText и устанавливать его.

Дальше мы пишем метод sayHi, очень простой и понятный :) Он просто выводит текст в консоль командой NSLog.

Давайте теперь добавим на нашу форму кнопку и привяжем к ней метод askForHi.
Как добавлять новый метод во ViewController, вы должны знать из старых уроков - поэтому добавьте его, чтобы он выглядел так (из ViewController.m):

-(IBAction)askHi:(id)sender
{
    
}

И не забудьте привязать его к кнопке! :)
На самый верх ViewController.m добавьте строчку:
#import "MyClass.h"

Эта строчка расскажет классу ViewController, что есть класс MyClass.
Теперь вернемся к нашему методу:
-(IBAction)askHi:(id)sender
{
    MyClass *obj = [[MyClass alloc] init];
    [obj sayHi];
    obj.myText = @"Some text";
}

Первая строка создает объект класса MyClass. О создании объекта - в следующих уроках, для начала будем знать, что объект создается именно так.
Затем мы вызываем метод sayHi, а в третьей строке записываем текст в строку.

Теперь, если запустить приложение и нажать на кнопку, то в консоли у вас появится строка Hello, world:

На этом я заканчиваю наш урок - надеюсь, у вас все получилось, а если есть вопросы - прошу в комменты.

На следующем уроке, со всеми нашими знаниями, мы разработаем первый, действительно рабочий проект :) который пригодится в хозяйстве)




2 комментария:

  1. Понимаю что времени писать наверно нет, но очень бы хотелось почаще уроки, может лучше понемногу, пусть просто про какие то зарезервированные слова, зато подробно и с примером, а когда будет время уже писать какой нибудь проект посложней, со ссылками на предыдущие статьи, где можно ознакомится?

    ОтветитьУдалить
    Ответы
    1. Да, Игорь, я думаю, что вы правы и наверное лучше делать уроки поменьше, но чаще - просто конкретно про Objective-C хотелось написать сразу и много :)

      Удалить