Является ли класс типом в Swift?

Ответ

Да, класс (class) в Swift является типом.

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

Пример объявления и использования класса как типа:

// Объявление типа `Person`
class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

// Использование класса как типа:
let john: Person = Person(name: "John") // Аннотация типа
func greet(person: Person) { }          // Параметр типа Person
func createPerson() -> Person { ... }   // Возвращаемый тип Person

Классы как ссылочные типы (Reference Types):

  • При присваивании экземпляра класса новой переменной или константе копируется ссылка на один и тот же объект в памяти.
  • Поддерживают наследование.
  • Могут иметь деинициализаторы (deinit).
let person1 = Person(name: "Alice")
let person2 = person1 // person2 ссылается на тот же объект, что и person1
person2.name = "Bob"
print(person1.name) // Выведет "Bob"

Ответ 18+ 🔞

А, ну ты про классы в Swift спрашиваешь! Ну да, конечно, блядь, класс — это тип. Это как бы само собой разумеется, ёпта.

Смотри, в Swift есть несколько основных кирпичей, из которых всё строится: class, struct, enum, protocol. И все они — типы, блядь. То есть ты можешь сказать: «Вот эта переменная у меня будет типа Person», а Person — это как раз класс, который ты сам наколбасил.

Вот, смотри, как это выглядит, чтобы не быть голословным:

// Вот объявляем тип, который называется `Person`. Это и есть класс, ёпта.
class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

// А теперь используем его как тип, потому что он и есть тип, блядь:
let john: Person = Person(name: "John") // Смотри, прямо пишем: тип — Person
func greet(person: Person) { }          // Сюда можно передать только объект класса Person
func createPerson() -> Person { ... }   // И эта функция обещает вернуть именно Person, а не какую-нибудь хуйню

И главная фишка классов, из-за которой потом бывает пиздец, если не понимать:

Они — ссылочные типы. Это значит, что когда ты присваиваешь объект класса новой переменной, ты не копируешь всю эту конструкцию, как с struct. Нет, блядь! Ты просто даёшь вторую пульку от того же пистолета, который целится в один и тот же объект в памяти. Овердохуище удобно, но и овердохуище опасно.

let person1 = Person(name: "Alice")
let person2 = person1 // person2 — это не копия, это вторая ссылка на ту же самую Алису в памяти, ёпта!
person2.name = "Bob" // Меняем имя через вторую ссылку...
print(person1.name) // Выведет "Bob", блядь! Потому что это один и тот же объект! person1 тоже стал Бобом! Вот такая хуйня, малята.

Вот поэтому, когда работаешь с классами, надо всегда помнить, что у тебя в руках не копия, а пульт дистанционного управления к живому объекту. Нажал одну кнопку — и у всех, у кого такой же пульт, тоже всё поменялось. Иногда это то, что нужно, а иногда — чистейший пиздец и баги на ровном месте.

Короче, да, класс — это полноценный тип, со всеми вытекающими, блядь, последствиями.