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


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

Ключевым моментом для построения объектно-ориентированного дизайна является возможность абстрагироваться от конкретных взаимодействий в программе, от конкретных предметов и явлений с помощью абстрактных конструкций. В языке Swift такими абстрактными конструкциями являются классы, структуры и перечисления. Сначала мы рассмотрим классы, а в последующих темах затронем структуры и перечисления.

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

Для определения класса используется ключевое слово class, после которого идет название класса:

1
2
3
class User {

}
В данном случае класс называется User. Все тело класса заключается в фигурные скобки.

Класс может содержать переменные и константы, которые хранят состояние объекта. Переменные и константы, определенные в классе, еще называют хранимые свойства класса (stored properties). Например:

1
2
3
4
5
class User {

var age: Int = 18
var name: String = ""
}
Здесь класс User определяет две переменных age и name, которые хранят соответственно возраст и имя пользователя.

Важно отметить, что здесь не просто определяются переменные, кроме того, им присваиваются начальные значения. Все переменные и константы в классе должны быть инициализированы к моменту использования класса.

Кроме переменных и констант в классе могут определены методы. Методы представляют собой функции, ассоциированные с определенным типом - классом, перечислением или структурой:

1
2
3
4
5
6
7
8
9
10
class User {

var age: Int = 18
var name: String = ""

func move(){

print("\(name) передвигается")
}
}
После определения класса мы можем использовать его в программе, в частности, создавать его объекты:

1
2
3
4
5
var tom: User = User()
tom.age = 22
tom.name = "Том"
print(tom.name) // Том
tom.move() // "Том передвигается"
Чтобы создать объект класса используется инициализатор, который представляет собой следующую конструкцию:

1
название_класса()
После названия класса идут пустые скобки. Эта конструкция создает объект, ссылку на который хранит переменная tom. Определение переменных и констант класса ничем не отличается от других переменных и констант.

После создания объекта класса мы сможем обращаться к его свойствам и методам. Для обращения к ним используется нотация точки. То есть после названия переменной tom ставится точка, после которой идет название свойства/метода:

1
2
tom.name = "Tom"
tom.move()
Ключевое слово self
Ключевое слово self позволяет обратиться к текущему экземпляру класса:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class User {

var age: Int = 0
var name: String = ""

func move(){

print("\(self.name) передвигается")
}
func getUserInfo(){

print("Имя: \(self.name); возраст: \(self.age)")
}
}