欢迎使用 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 类型,如 Int
、Float
、Double
、Bool
、URL
、UUID
、Data
等已扩展为符合 EnvironmentStringConvertible
协议。集合类型,如 Array
、Set
和 Dictionary
也通过条件一致性进行了扩展。
您可以为其他类、结构体或枚举添加一致性,以使其他类型可以用作环境变量。
自定义 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
一致性
对于已符合 LosslessStringConvertible
或 RawRepresentable
的类型,提供了 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 的完整文档。
Environment 需要 Xcode 10 或带有 Swift Package Manager 的 Swift 5 工具链。
将 Environment 包作为依赖项添加到您的 Package.swift
文件中。
.package(url: "https://github.com/wlisac/environment.git", from: "0.11.1")
将 Environment 添加到您的目标的依赖项中。
.target(name: "Example", dependencies: ["Environment"])