Подтвердить что ты не робот

Ссылаясь на переменные среды в Swift

Кто-нибудь знает, как я могу захватить переменную окружения в Swift?

4b9b3361

Ответ 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)")
}