Я новичок в Swift, работаю с C и Java.
Я пытаюсь передать объект структуры (называемый «Игрок») с одного контроллера представления на другой, и, как я узнал, один правильный способ сделать это сначала определить его в целевом VC, например:
class TargetVC: UIViewController {
var playerVar: Player!
}
А затем назначить его в функции подготовки внутри исходного VC:
if let targetVC = segue.destination as? TargetVC
{
targetVC.playerVar = myPlayer
}
Но я подумал о том, чтобы просто использовать глобальную переменную для передачи объекта Player
целевому контроллеру представления, определив его следующим образом:
var myPlayer = Player() // Global Variable
class SourceVC: UIViewController {
}
Затем достигнув его в целевом VC:
class TargetVC: UIViewController {
myPlayer.name = // Stuff
}
Будет ли этот метод вызывать какие-либо проблемы во время выполнения или у него есть какие-то недостатки? Если да, то какие?
Заранее спасибо.
@CerlinBoss Да, я думаю, что это самый главный недостаток. Спасибо.
Одним из недостатков является то, что, как следует из названия, все имеет доступ к глобальным переменным, даже те, у которых нет причин видеть, а тем более изменять эти данные.
Passing data
дает вам возможность следовать принципам программирования для создания хороших классов даже в вашем примере. Это делает классы более расширяемыми и повторно используемыми во многих случаях.
Global var
дает некоторые преимущества для получения необходимых данных, но вы должны заботиться о reference cycles
, memory managing
, обрабатывать threads
, queues
и blocks
и т. д.
Вы также можете прочитать о singletones
, static vars
,... — где вы можете получить некоторые данные из переменных области видимости класса.
Вот некоторые встроенные классы singletone и их переменные в Swift UIKit, относящиеся к классу: UIScreen.main
, UserDefaults.standard
, DispatchQueue.main
и т. д. Изучение технологии singletone будет очень полезно для начинающих.
«Это делает классы более расширяемыми и повторно используемыми во многих случаях». Почему? «но вы должны заботиться об опорных циклах, управлении памятью, обработке потоков, очередей и блоков и т. д.» ??? Разве это не применимо при использовании инъекции зависимостей?
Хорошие классы стараются избегать использования глобальных переменных, чтобы их можно было использовать с другими параметрами. Вы можете использовать его вместе или передать свои услуги классу. Одно другому не мешает.
Неуправляемый доступ. Представьте, что у вас есть 10 мест, где вы перезаписываете эту переменную, по мере роста кода у вас будет очень мало контроля над тем, кто получает доступ к переменным данным или изменяет их.