Классы и объекты

Классы и объекты - Start iOS | Уроки по разработке iOS приложений

Пришло время изучить такую разновидность абстрактного типа данных в программировании как классы. По-мимо этого рассмотрим что такое объекты и в чем заключается разница между понятиями объекта и класса. Во всём этом нам поможет проект «Привет, Мир!», который мы будем модифицировать в этом уроке.

Классы

Обратимся к Wikipedia, чтобы получить точное понятие класса:

Класс — разновидность абстрактного типа данных в объектно-ориентированном программировании (ООП), характеризуемый способом своего построения. […] Суть отличия классов от других абстрактных типов данных состоит в том, что при задании типа данных класс определяет одновременно и интерфейс, и реализацию для всех своих экземпляров, а вызов метода-конструктора обязателен. […] На практике объектно-ориентированное программирование сводится к созданию некоторого количества классов, включая интерфейс и реализацию, и последующему их использованию.

Проще говоря, класс — способ организации атрибутов (переменных), методов и выступает в роли «заготовки». Откроем проект HelloWorld и рассмотрим теорию на практике.

В Swift инициализация класса выглядит следующим образом:

Классы и объекты - Start iOS

Структура инициализации класса в Swift

В поле name указывается любое произвольное имя, в super class — тип родительского класса (UIViewController, NSObject, Int, String, Array и другие) и в поле code создаётся тело класса со всеми его переменными (атрибутами) и методами. На самом деле это чем-то похоже на создание функции.

На данный момент в навигаторе имеется несколько файлов и у нас уже есть два класса: AppDelegate.swift и ViewController.swift. Откроем последний и посмотрим на его структуру:

Т.е. ViewController.swift — это класс с именем ViewController и его родительский класс — UIViewController.

Как упоминалось ранее: класс — абстрактное понятие. Это значит, что класс, тем или иным образом, описывает поведение и свойства какого либо объекта. Будем отталкиваться от этого понимания и постараемся частично описать поведение человека.

Создадим новый класс и добавим его к проекту. Нажмите cmd+N или в контекстном меню перейдите по вкладкам File->New->File. Перед Вами откроется новое окно:

Классы и объекты

Окно добавления нового файла в Xcode

Убедитесь, что выбрана вкладка iOS -> Source и выберите Cocoa Touch Class, после чего нажмите Next. В следующем окне заполните поля таким образом:

  • Class (имя класса) — Human.
  • Subclass of (родительский класс) — NSObject.
  • Language: Swift.

Нажмите Next и в следующем окне выберите папку проекта, где класс будет сохранен и жмите Finish. Всё — теперь в проекте имеется новый класс Human.swift. Убедитесь, что именно этот класс открыт в редакторе и обратите внимание на его структуру:

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

Итак, мы хотим знать:

  • Имя — тип String.
  • Фамилия — тип String.
  • Возраст — тип Int.

Он должен делать:

  • Называть свои имя и фамилию;
  • Называть свой возраст;

и…

  • Бежать;
  • Останавливаться.

Теперь, когда мы знаем какие свойства человека должен описывать класс, добавим соответствующие атрибуты (переменные) в тело класса:

Далее добавим необходимые методы:

Названия методов говорят сами за себя:

  • getFullName — возвращает полное имя человека в виде стринга.
  • getAge — возвращает фразу с возрастом человека также в виде строке.
  • run — печатаем в лог сообщение о начале бега (в ответ ничего не ждем)
  • stopRun — печатаем сообщение об остановке бега.

Мы узнали ранее, что все классы должны быть инициализированы, ведь в противном случае нам не удастся воспользоваться ими. Для этого имеется стандартный метод init(). При его вызове создаётся объект класса, но при этом все его атрибуты не будут заданы. Для удобства, напишем свой инициализатор сразу после объявленных переменных:

Обратите внимание на self. Этим мы даём компилятору понять, что ссылаемся на переменную текущего класса и задаём ей значение параметра функции init():

Классы и объекты - Start iOS

Наш класс готов и мы можем приступить к разборку понятия объекта на практике.

Объекты

Объект — некоторая сущность в виртуальном пространстве, обладающая определённым состоянием и поведением, имеющая заданные значения свойств (атрибутов) и операций над ними (методов). Как правило, при рассмотрении объектов выделяется то, что объекты принадлежат одному или нескольким классам, которые определяют поведение (являются моделью) объекта.

По сути, объект (он же экземпляр класса) — класс после инициализации, сущность в памяти, которая имеет своё индивидуальное состояние атрибутов. Для большего понимания, можно изобразить классы и  объекты таким образом:

Классы и объекты - Start iOS

Классы и объекты

Откроем уже знакомый нам ViewController.swift и добавим два новых объекта мужчины и женщины перед методом viewDidLoad():

Мы сразу инициализировали объект men с помощью нашего собственного метода init(), а инициализацию объекта women осуществим в методе viewDidLoad() и там же заполним все его атрибуты поэтапно:

Здесь же можем добавить вызов нескольких методов:

Запустим наше приложение и в логе увидим следующее:

Мы видим, что в результате мы имеем два объекта men и woman, которые инициализированы в памяти, содержат свои индивидуальные значения (имена, фамилии и возраст) и являются производными от класса.

Итоги

Подведём итоги, для того чтобы закрепить свои знания и понимание что же такое классы и объекты:

  • Класс — это заготовка для будущих объектов.
  • Объект является производным от класса и принадлежит другому классу.
  • Объект — это сущность класса.
  • Хранение в памяти:
    • Класс: не инициализирован.
    • Объект: инициализирован и хранится в памяти.
  • Объявление:
    • Класс: объявлен только раз.
    • Объект: может объявляться множество раз.

Постарайтесь модифицировать то что уже готово. Добавьте несколько атрибутов и методов в класс Human.swift и вызовите их в классе ViewController.swift.

Подписывайтесь на наши уроки и следите за обновлениями!