Пришло время изучить такую разновидность абстрактного типа данных в программировании как классы. По-мимо этого рассмотрим что такое объекты и в чем заключается разница между понятиями объекта и класса. Во всём этом нам поможет проект «Привет, Мир!», который мы будем модифицировать в этом уроке.
Классы
Обратимся к Wikipedia, чтобы получить точное понятие класса:
Класс — разновидность абстрактного типа данных в объектно-ориентированном программировании (ООП), характеризуемый способом своего построения. […] Суть отличия классов от других абстрактных типов данных состоит в том, что при задании типа данных класс определяет одновременно и интерфейс, и реализацию для всех своих экземпляров, а вызов метода-конструктора обязателен. […] На практике объектно-ориентированное программирование сводится к созданию некоторого количества классов, включая интерфейс и реализацию, и последующему их использованию.
Проще говоря, класс — способ организации атрибутов (переменных), методов и выступает в роли «заготовки». Откроем проект HelloWorld и рассмотрим теорию на практике.
В Swift инициализация класса выглядит следующим образом:

Структура инициализации класса в Swift
В поле name указывается любое произвольное имя, в super class — тип родительского класса (UIViewController, NSObject, Int, String, Array и другие) и в поле code создаётся тело класса со всеми его переменными (атрибутами) и методами. На самом деле это чем-то похоже на создание функции.
На данный момент в навигаторе имеется несколько файлов и у нас уже есть два класса: AppDelegate.swift и ViewController.swift. Откроем последний и посмотрим на его структуру:
|
1 2 3 |
class ViewController: UIViewController { // Тело класса } |
Т.е. 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. Убедитесь, что именно этот класс открыт в редакторе и обратите внимание на его структуру:
|
1 2 3 4 5 |
import UIKit class Human: NSObject { } |
Перейдем к написанию тела класса. Давайте для начала определим что мы хотим знать о человеке, указав его свойства (атрибуты), а также определимся что он должен уметь делать (методы).
Итак, мы хотим знать:
- Имя — тип String.
- Фамилия — тип String.
- Возраст — тип Int.
Он должен делать:
- Называть свои имя и фамилию;
- Называть свой возраст;
и…
- Бежать;
- Останавливаться.
Теперь, когда мы знаем какие свойства человека должен описывать класс, добавим соответствующие атрибуты (переменные) в тело класса:
|
1 2 3 |
var firstName: String = "" var lastName: String = "" var age: Int = 0 |
Далее добавим необходимые методы:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
func getFullName() -> String { return "\(firstName) \(lastName)" } func getAge() -> String { return "I am \(age) years old" } func run() { print("I'm running") } func stopRun() { print("I stopped") } |
Названия методов говорят сами за себя:
- getFullName — возвращает полное имя человека в виде стринга.
- getAge — возвращает фразу с возрастом человека также в виде строке.
- run — печатаем в лог сообщение о начале бега (в ответ ничего не ждем)
- stopRun — печатаем сообщение об остановке бега.
Мы узнали ранее, что все классы должны быть инициализированы, ведь в противном случае нам не удастся воспользоваться ими. Для этого имеется стандартный метод init(). При его вызове создаётся объект класса, но при этом все его атрибуты не будут заданы. Для удобства, напишем свой инициализатор сразу после объявленных переменных:
|
1 2 3 4 5 6 7 8 |
convenience init(firstName: String, lastName: String, age: Int) { self.init() self.firstName = firstName self.lastName = lastName self.age = age } |
Обратите внимание на self. Этим мы даём компилятору понять, что ссылаемся на переменную текущего класса и задаём ей значение параметра функции init():

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

Классы и объекты
Откроем уже знакомый нам ViewController.swift и добавим два новых объекта мужчины и женщины перед методом viewDidLoad():
|
1 2 |
var men = Human(firstName: "John", lastName: "Smith", age: 22) var women: Human! |
Мы сразу инициализировали объект men с помощью нашего собственного метода init(), а инициализацию объекта women осуществим в методе viewDidLoad() и там же заполним все его атрибуты поэтапно:
|
1 2 3 4 5 |
// Инициализируем объект women self.women = Human() self.women.firstName = "Joan" self.women.lastName = "Wattson" self.women.age = 18 |
Здесь же можем добавить вызов нескольких методов:
|
1 2 3 4 5 6 7 8 9 10 11 |
// Получим полное имя мужчины и напечатаем результат в лог let menName = self.men.getFullName() print("Men name: \(menName)") // Получим возраст женщины и напечатаем результат в лог let womenAge = self.women.getAge() print("Women age: \(womenAge)") // Заставим мужчину бежать и остановим self.men.run() self.men.stopRun() |
Запустим наше приложение и в логе увидим следующее:
|
1 2 3 4 |
Men name: John Smith Women age: I am 18 years old I'm running I stopped |
Мы видим, что в результате мы имеем два объекта men и woman, которые инициализированы в памяти, содержат свои индивидуальные значения (имена, фамилии и возраст) и являются производными от класса.
Итоги
Подведём итоги, для того чтобы закрепить свои знания и понимание что же такое классы и объекты:
- Класс — это заготовка для будущих объектов.
- Объект является производным от класса и принадлежит другому классу.
- Объект — это сущность класса.
- Хранение в памяти:
- Класс: не инициализирован.
- Объект: инициализирован и хранится в памяти.
- Объявление:
- Класс: объявлен только раз.
- Объект: может объявляться множество раз.
Постарайтесь модифицировать то что уже готово. Добавьте несколько атрибутов и методов в класс Human.swift и вызовите их в классе ViewController.swift.
Подписывайтесь на наши уроки и следите за обновлениями!