Кто-нибудь знает, как я могу захватить переменную окружения в Swift?
Ссылаясь на переменные среды в Swift
Ответ 1
Swift 3 и выше:
import Foundation
if let value = ProcessInfo.processInfo.environment["key"] {
...
}
Ответ 2
Наряду с методом, основанным на NSProcessInfo, упомянутом Олегом, вы можете обращаться к переменным среды, используя стандартную функцию C getenv, например:
Swift 2.x:
func getEnvironmentVar(name: String) -> String? {
let rawValue = getenv(name)
guard rawValue != nil else { return nil }
return String(UTF8String: rawValue)
}
Swift 3.0:
func getEnvironmentVar(_ name: String) -> String? {
guard let rawValue = getenv(name) else { return nil }
return String(utf8String: rawValue)
}
Также возможно установить переменные среды с помощью функции setenv:
func setEnvironmentVar(name: String, value: String, overwrite: Bool) {
setenv(name, value, overwrite ? 1 : 0)
}
Причина, по которой я упоминаю способность устанавливать переменные, - это то, что я единственный способ установить переменные при работе на игровой площадке Xcode.
Недавно мне захотелось увидеть обратную линию для странной ошибки CGContext, которую я получал при работе с "живым" представлением на игровой площадке. По умолчанию backtrace не отображается в консоли, поэтому мне пришлось установить переменную среды CG_CONTEXT_SHOW_BACKTRACE, чтобы увидеть, что было:
setenv("CG_CONTEXT_SHOW_BACKTRACE", "1", 1)
После этого было плавное плавание. Ну, кроме ошибки CGContext, которую я получал, но это тема для другого дня.
Надеюсь, это поможет!
P.S. Вышеупомянутые функции требуют импорта модуля Darwin. Foundation автоматически импортирует Darwin, но я думал, что должен упомянуть об этом.
Ответ 3
Да, это возможно. Используйте ProcessInfo для этого.
Простой пример:
let dic = ProcessInfo.processInfo.environment
if dic["VAR"] != nil {
}
Ответ 4
Так как Swift 3 NSProcessInfo был переименован в ProcessInfo.
И метод processInfo() был заменен свойством ProcessInfo.
import Foundation
for (key, value) in ProcessInfo.processInfo.environment {
print("\(key): \(value)")
}