Почему не создаются экземпляры классов?

class

#1

В основах языка Swift говорится, что класс это паттерн, типа шаблона, на основе которого создаются экземпляры. И основная работа производится именно с этими экземплярами.

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

А где же тогда экземпляры классов? Как это работает?


#2
// Это класс
class User {
    var name: String?
}
// Это создание экземпляра класса
let user = User()

// А это создание другого экземпляра
let user2 = User()

// Это работа с экземпляром класса
user.name = "Вася"

#3

Это так. Но если пойти дальше, то получаем следующую картину:

Создаем объект в отдельном файле. Для простоты возьмем структуру.

struct User {
    var name: String?      
}

Затем создаем экземляры этого объекта во ViewController:

class ViewController: UIViewController {
    
    var user = User()
    var user2 = User()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        user.name = "Vasya"
        user2.name = "Tanya"
    }
}

И вопрос такой - почему это все происходит внутри класса ViewController? Разве мы не должны создавать экземпляры этого класса и работать уже с ними? Ведь по логике получается, что весь код, который мы пишем внутри этого класса есть свойства и методы этого темплэйта, шаблона.


#4

Потому что это MVC, и в нем принято писать код в контроллере.

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


#5

Сексуальные предпочтения у каждого из нас разные, this is reality. Но в данном случае мы говорим о некоторых общих правилах. Т.е. получается, что одно из базовых правил о создании и использовании экземпляров в данном случае, даже не знаю как точно сказать, то ли отменяется, то ли игнорируется, то ли каким-то образом трансформируется. Или, возможно, что viewController это некий специфический класс, где такое возможно.

Или это специфика именно архитектуры MVC, а в других для каждого класса строго создаются свои экземпляры?


#6

Каким образом? Вам никто не запрещает писать код внутри класса.


#7

It seems вы уходите от ответа)). Понятно конечно, что можно писать код и внутри, и вне класса. Но ведь базовая концепция ООП состоит в том, что мы создаем экземпляры из типов и потом эти экземпляры взаимодействуют между собой.

Единственное объяснение я вижу, что, например, Table View Controller это не просто типы, а такие объекты, где внутри может происходить взаимодействие между экземплярами. Т.е. это и тип, и что-то еще. И тут напрашивается как объяснение все та же модель MVC, где контролер это такой объект, через который взаимодействуют models и views.


#8

Методы зачем тогда у классов по вашему?

ООП это: наследование + инкапсуляция + полиморфизм


#9

Ни кто не отменял ООП. Попробуете подумать о том как работает приложение. Что после запуска (под капотом) вызывается некий метод main() который инициализирует объекты (т.е. создает экземпляры класса) в том числе и ваш VC, который наследуется от базового UIVC. Используя тот же полиморфизм вы можете переопределять его поведение. Например переопределять методы анимации, если вам это не нужно будут вызываться методы родителя т.е. UIVC где парни из apple, прописали базовое поведение. Вы так же можете в своем VC (не забывайте вы создали свой класс унаследовав его и теперь это ваше) вы так же в нем можете например создать (инжектировать) экземпляр еще каково-нибуть класса (например ваш класс для работы с сетью) а тот может содержать в себе экземпляры других классов, ну положем для Авторизации и т.д. И вы также прописали его название, ну например в сториборде, что бы система по имени вашего VC смогла создать его экземпляр и отобразить UI как вы его описали в СВОЕМ классе VC. Я конечно все упростил, но принцип думаю понятен.


#10

Что за базовое правило? Подскажите.
Ты же можешь внутри своих классов и структур новые описать и создать. :slight_smile:
(хотел привести пример с enum в котором описывается структура прям в одном из case. Но не буду засорять.


#11

Ты не понял суть ООП. :slight_smile: Надо освежить в памяти что там и как. :thinking:


#12

Шаблон это описание класса (абстракция), в описание входят имена и типы переменных, имена методов их параметры и возвращаемые значения, на основе этого создаются экземпляры:

class User {
    //  имя   тип
    var name: String
    //  имя  тип
    var age: Int
    
    //   имя    параметры               возвращаемые значения
    func set(name: String, age: Int) -> Void
}

Вся логика внутри методов класса, это его реализация (имплементация) и она создается отдельно для каждого экземпляра и через self с экземпляром можно работать:

class User {
    //         реализация
    var name = "anonymous"
    //        реализация
    var age = -1
    
    func set(name: String, age: Int) -> Void { // --> реализация
        self.name = name
        self.age = age
    } // <-- реализация
}

Надеюсь ещё сильнее не запутал :slight_smile: