Кто-нибудь знает, как я могу захватить переменную окружения в 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)")
}