Нужна переменная, чтобы доставать значение её в разных классах, как быть?

Если вам необходимо иметь переменную, значение которой можно доставать в разных классах, в языке программирования Swift существует несколько подходов, чтобы достичь этой функциональности. Рассмотрим несколько из них:

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

   var globalVariable = 10
   
   class MyClass {
       // Код класса...
   }

Использование глобальной переменной в других классах или структурах будет выглядеть следующим образом:

   class AnotherClass {
       func doSomething() {
           print(globalVariable)
       }
   }

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

2. Использование статической переменной в классе:
Если вам нужна переменная, которая будет доступна только из определенного класса (и его подклассов), вы можете объявить статическую переменную:

   class MyClass {
       static var sharedVariable = 20
       
       // Код класса...
   }

Доступ к статической переменной будет следующим образом:

   class AnotherClass {
       func doSomething() {
           print(MyClass.sharedVariable)
       }
   }

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

3. Использование специального механизма передачи данных или паттерна проектирования:
В Swift существует множество механизмов передачи данных между классами или структурами, таких как делегирование (delegation), блоки завершения (completion blocks), наблюдатели свойств (property observers), паттерн одиночка (singleton pattern) и другие. Выбор зависит от ваших конкретных потребностей и архитектуры вашего приложения.

Например, использование делегирования может выглядеть следующим образом:

   protocol MyDelegate {
       func didGetNewValue(value: Int)
   }

   class MyClass {
       var delegate: MyDelegate?
       
       func someFunction() {
           delegate?.didGetNewValue(value: 30)
       }
   }

   class AnotherClass: MyDelegate {
       let myClass = MyClass()
       
       init() {
           myClass.delegate = self
       }
       
       func didGetNewValue(value: Int) {
           print(value)
       }
   }

В этом примере класс AnotherClass действует как делегат для класса MyClass. Когда в MyClass происходит изменение значения, вызывается соответствующий метод делегата didGetNewValue(value:).

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