利用 Swift 的 Decodable
对环境进行类型安全的访问
将 .package(url: "https://github.com/SwiftScream/swift-environment-decoder.git", from: "0.4.0")
添加到您的 Package.swift 依赖项中
import EnvironmentDecoder
struct MyEnvironmentFeatureFlags: Decodable {
let enableA: Bool
let enableB: Bool
}
struct MyEnvironment: Decodable {
let port: UInt16
let allowedRegions: [String]
let featureFlags: MyEnvironmentFeatureFlags
}
let environment = try EnvironmentDecoder().decode(MyEnvironment.self)
print("\(environment.allowedRegions.count) allowed region(s)")
print("listening on port \(environment.port)")
if environment.featureFlags.enableA {
print("A is enabled")
}
if environment.featureFlags.enableB {
print("B is enabled")
}
上面的代码期望以下形式的环境
PORT=1234
ALLOWED_REGIONS=regionA,regionB,regionC
FEATURE_FLAGS_ENABLE_A=true
FEATURE_FLAGS_ENABLE_B=false
如果环境无法解码为指定的类型,将抛出 Swift.DecodingError
。
这是及早发现环境问题的好方法。 在某些情况下,输出一条消息并终止进程可能是合适的。
以下是一些可能发生这种情况的例子
let environment: MyEnvironment
do {
environment = try EnvironmentDecoder().decode(MyEnvironment.self)
} catch {
fatalError(error.localizedDescription)
}
默认情况下,EnvironmentDecoder 将解码 ProcessInfo.processInfo.environment
。 如果这不是你想要的,你可以传入一个 [String: String]
来代替。
let someEnvDictionary: [String: String] = //...
let environment = try EnvironmentDecoder().decode(MyEnvironment.self, from: someEnvDictionary)