🌳 Environment

swift platforms version twitter
build jazzy codecov

欢迎使用 Environment – 一种在 Swift 中更友好、类型安全地处理环境变量的方式。

用法

访问环境变量

Environment 结构体提供了一个类型安全的 API 来获取和设置环境变量。

import Environment

let environment = Environment.environment

// Get "HOST" as String value
let host = environment["HOST"]

// Set "PORT" to String value of "8000"
environment["PORT"] = "8000"

环境变量默认以 String 值访问,但可以转换为任何符合 EnvironmentStringConvertible 协议的类型。

// Get "HOST" as URL value
let host: URL? = environment["HOST"]

// Get "PORT" as Int value
let port: Int? = environment["PORT"]

// Set "PORT" to Int value of 8000
environment["PORT"] = 8000

// Get "APP_ID" as UUID value or use a default UUID if "APP_ID" is not set
let appID = environment["APP_ID"] ?? UUID()

动态成员查找

Environment 结构体还支持使用 @dynamicMemberLookup 访问环境变量。

// Get "HOST" as URL value using dynamic member lookup
let host: URL? = environment.HOST

// Set "PORT" to Int value of 8000 using dynamic member lookup
environment.PORT = 8000

静态下标

Environment 结构体支持在 Swift 5.1 中使用静态下标访问环境变量。

import Environment
import Foundation

// Get "HOST" as URL value using static subscript
let host: URL? = Environment["HOST"]

// Set "PORT" to Int value of 8000 using static subscript
Environment["PORT"] = 8000

@dynamicMemberLookup 也适用于静态下标。

// Get "HOST" as URL value using static dynamic member lookup
let host: URL? = Environment.HOST

// Set "PORT" to Int value of 8000 using static dynamic member lookup
Environment.PORT = 8000

属性包装器

EnvironmentVariable 属性包装器使得属性能够在 Swift 5.1 中由环境变量支持。

以下示例展示了如何使用 EnvironmentVariable 属性包装器来暴露由环境变量("HOST""PORT")支持的静态属性。

enum ServerSettings {
    @EnvironmentVariable(name: "HOST")
    static var host: URL?
    
    @EnvironmentVariable(name: "PORT", defaultValue: 8000)
    static var port: Int
}

类型安全变量

环境变量可以从 String 表示形式转换为任何符合 EnvironmentStringConvertible 协议的类型。

标准库和 Foundation 类型,如 IntFloatDoubleBoolURLUUIDData 等已扩展为符合 EnvironmentStringConvertible 协议。集合类型,如 ArraySetDictionary 也通过条件一致性进行了扩展。

您可以为其他类、结构体或枚举添加一致性,以使其他类型可以用作环境变量。

自定义 EnvironmentStringConvertible 一致性

enum Beverage {
    case coffee
    case tea
}

extension Beverage: EnvironmentStringConvertible {
    init?(environmentString: String) {
        switch environmentString {
        case "coffee":
            self = .coffee
        case "tea":
            self = .tea
        default:
            return nil
        }
    }
    
    var environmentString: String {
        switch self {
        case .coffee:
            return "coffee"
        case .tea:
            return "tea"
        }
    }
}

let beverage: Beverage? = environment["DEFAULT_BEVERAGE"]

默认 EnvironmentStringConvertible 一致性

对于已符合 LosslessStringConvertibleRawRepresentable 的类型,提供了 EnvironmentStringConvertible 的默认实现。

例如,String 支持的枚举是 RawRepresentable,并且可以使用 EnvironmentStringConvertible 一致性的默认实现。

enum CompassPoint: String {
    case north
    case south
    case east
    case west
}

extension CompassPoint: EnvironmentStringConvertible { }

let defaultDirection: CompassPoint? = environment["DEFAULT_DIRECTION"]

API 文档

访问在线 API 参考以获取公共 API 的完整文档。

安装

Environment 需要 Xcode 10 或带有 Swift Package Manager 的 Swift 5 工具链。

Swift Package Manager

将 Environment 包作为依赖项添加到您的 Package.swift 文件中。

.package(url: "https://github.com/wlisac/environment.git", from: "0.11.1")

将 Environment 添加到您的目标的依赖项中。

.target(name: "Example", dependencies: ["Environment"])