Это работает также и проще
inline fun <reified T> Gson.fromJson(json: String) : T =
this.fromJson<T>(json, T::class.java)
Глобальные переменные или одиночный элемент выполнят то же самое здесь. Оба могут использоваться для превращения 'ключевых' имен в Какао, которое не бросит ошибку компилятора, если оно будет написано c орфографическими ошибками в ошибку компилятора. Это - основная цель. Глобальные переменные немного легче, хотя видя, поскольку требуется меньше ввода.
Вместо того, чтобы делать это:
[myArray setObject:theObject forKey:MyGlobalVariableKeyName];
необходимо было бы сделать что-то вроде:
[myArray setObject:theObject
forKey:[[MySingletonVariableClass getInstance] myVariableKeyName];
Глобальные переменные значительно меньше вводят для того же эффекта.
Вызов его глобальная переменная является технически корректным, но вводящим в заблуждение.
Это - глобальная константа - глобальный в объеме, но постоянный и поэтому не плохо в том смысле, что глобальные переменные плохи.
, Чтобы показать, как глобальный константы являются распространенными, безопасными и многочисленными, рассмотрите эти примеры глобальных констант:
NSApp
). единственное время, которое необходимо взволновать по поводу глобальных констант, - когда их названия являются слишком родовыми (они могут загрязнить глобальное пространство имен). Не используйте имена, которые, вероятно, будут конфликтовать с чем-либо (всегда используют префикс и всегда делают имя, определенное для задачи как NSKeyValueObservingOptionNew
).
Только, чтобы быть ясной, рекомендация состоит в том, чтобы создать неизменный глобальные переменные вместо встроенных строковых констант (трудно для рефакторинга и никакое время компиляции, проверив) или #defines (никакое время компиляции, проверив). Вот то, как Вы могли бы сделать так...
в MyConstants.h:
extern NSString * const MyStringConstant;
в MyConstants.m:
NSString * const MyStringConstant = @"MyString";
затем в любом другом.m файле:
#import "MyConstants.h"
...
[someObject someMethodTakingAString:MyStringConstant];
...
Таким образом, Вы получаете время компиляции, проверяя, что Вы не написали строковую константу c орфографическими ошибками, можно проверить на равенство указателя, а не представить равенство в виде строки [1] в сравнении констант, и отладка легче, так как константы имеют строковое значение во время выполнения.
[1] В этом использовании, Вы по существу используете значения указателя в качестве констант. Это именно так происходит, на который те конкретные целые числа также указывают на строки, которые могут использоваться в отладчике
Постоянные globals, которые установлены во время компиляции и никогда не изменяются, приемлемы для меня. При твердом кодировании строки это - то же самое, просто скрытое компилятором. Я буду избегать изменяемого globals как чумы.
Помнят, сама Apple использует ту же технику. Многие константы, которыми я ожидал быть, определяют, на самом деле константы. Вы получите ошибки ссылки, если заголовки будут достижимы, но платформа не.
Это зависит от дизайна Вашего программного обеспечения. Предположим, что у Вас есть программное обеспечение управления заданием, и одно из Ваших "значений по умолчанию" является списком каталогов, в которых могут быть сохранены различные объекты.
Для каждого Job у Вас может быть storagefile участник, который является одиночным элементом, которые загружаются, пользователь предпочел местоположения при запуске.
Или у Вас мог быть член Storagefile вызываемого пользователя глобальной переменной Предпочтения. Все еще мог быть одиночный элемент, но действительно не имеет значения в этом случае.
Для меня сложные значения по умолчанию (десятки различных типов классов) должны находиться в их собственном "пространстве", доступном для моделирования.
Однако могут быть предпочтения, которые важны для того, как Задание является установкой так те, которые предпочтение должно быть сохранено в Объекте Job поэтому при открытии его в приложении другого пользователя, это работает, как предназначено.
Снова это зависит от Вашего дизайна.