2015-12-26 3 views
3

Я изучаю разработку приложений Swift и iOS, и мне было интересно, в каких случаях (если они есть) я должен использовать глобальные переменные и константы в приложении iOS.Когда использовать глобальные переменные в Swift

Глобальные переменные - это переменные, которые определены вне любого контекста функции, метода, закрытия или типа. Локальными переменными являются переменные, которые определены в контексте функции, метода или закрытия.

Использование глобальных переменных, как правило, кажется, безвкусный и не рекомендуется (это на самом деле не рекомендуется большинством руководств и учебных пособий), а также для передачи данных между контроллером зрения я использую метод prepareForSegue(_: sender:).

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

Например, Apple рекомендует хранить NSDateFormatter или NSNumberFormatter для каждого шаблона формата и не воссоздавать или изменять его каждый раз, когда это необходимо. В приложении, которое я разрабатываю, чтобы изучить язык, большинство контроллеров представлений используют NSDateFormatter и NSNumberFormatter, а создание нового для каждого контроллера представления может быть не очень хорошей идеей. Я мог бы передать его с помощью prepareForSegue, но я подумал, что, возможно, в этом случае было бы лучше использовать глобальный var, содержащий экземпляр форматирования, который мог бы использовать каждый контроллер вида.

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

+3

Я так не считаю. Даже для примера, который вы предоставляете, вы можете «хранить» эти форматиры как свойства, например, singleton 'Settings'. И даже вызвав именованный синглтон, вы не сможете выполнить глобальный const, а через статическое свойство класса. – courteouselk

+0

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

+2

Глобалы удобны, но их следует избегать. Google «globals are evil», и вы найдете массу дискуссий о том, почему это плохо, альтернативы и т. Д. К сожалению, этот вопрос (а) обсуждался здесь много раз; и (б) является вопросом мнения, так или иначе, поэтому этот вопрос должен быть закрыт. – Rob

ответ

7

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

В модели singleton pattern вы создаете класс и закладываете свой глобальный внутри него. Это часто предлагается как решение, потому что это проще всего прописать и следовать, но много раз мне интересно, является ли это вообще решением. Объединение класса вокруг глобального не дает вам дополнительной защиты. В конце концов, сам класс теперь является глобальной сущностью. Мне нравится думать о шаблоне Singleton как способе организации, классификации и сдерживания глобалов, а не для исключения глобальных.

Синглы должны быть зарезервированы для шатунов вашего приложения, таких как базы данных или удаленные обработчики подключения к серверу. Каждое приложение Cocoa/CocoaTouch поставляется со встроенным в Singleton, AppDelegate, и во многих случаях различные вещи могут идти туда.

Во многих случаях «правильное» решение равно , передает данные, например, передавая данные между контроллерами вида в классе prepareForSegue:. Это хорошо описано в блестящей сессии WWDC 2014 Энди Матушака, Advanced iOS Application Architecture and Patterns. Я согласен с вами, что это не применимо в вашем примере. В вашем примере вы не передаете релевантные данные между двумя представлениями, вы пытаетесь использовать общий ресурс для ресурсов conserver.

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

extension NSDateFormatter { 
    static let newDateFormatter = NSDateFormatter() 
} 

// use it in your app like this: 
NSDateFormatter.newDateFormatter 

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

+0

Я не могу понять, что структура Cocoa, кажется, заставляет вас писать все приложение в одном классе, похоже, и это самая глупая вещь, я просто не могу иметь свои собственные структуры и классы и пакеты – nikoss

Смежные вопросы