В iOS я использую структуру, содержащую только статические элементы, для группировки всех данных среды, таких как константы и глобальные переменные (таким образом, код гораздо удобнее для чтения в коде и позволяет иметь некоторую иерархию).
Некоторые из этих данных зависят от сборки: PROD (действие), DEV (побег) и ACC (eptance); Я решаю эту проблему, используя разные цели в xCode и используя специальный файл расширения, который включен только для соответствующих целей PROD, DEV и ACC. Это прекрасно работает в xCode / iOS / Swift:
//defines environment variables and functions that are not dependant on the dev, prod and acc builds of the app
struct Environment {
//defines constants that are independant of the environment
struct Constants {
static let unInitializedId = "unInitializedId"
static let userLanguageKey = "userlanguage"
struct IAP {
static let prodId_PackagePrefix = "com.example.packprefix"
static let prodId_Package_Custom = "com.example.custom"
static let prodId_Package_Favorites = "com.example.fav"
}
}
//different storyboards used in the app
struct StoryBoard {
static let main = "main"
static let exercises = "exercises"
static let trainings = "trainings"
static let packages = "packages"
static let videos = "videos"
static let common = "common"
static let alerts = "alerts"
}
static let downloadManager = DownloadManager(diskCacheFolder: "cache_downloadmanager")
static let remoteConfig = RemoteConfig.remoteConfig()
}
//defines environment stuff special for PROD builds
//this is included in a seperate file (only included to build for PROD builds)
extension Environment {
static let remoteConfig = RemoteConfig.remoteConfig()
struct Constants {
static let appId = 1010123
}
static func start() {
//...some prod environment init code here
}
}
func howItsUsed() {
//initialize the build dependant environment
Environment.start()
//get build independant constant and obj out of the environment
let buildIndependant_var = Environment.Constants.unInitializedId
let buildIndependant_iap = Environment.Constants.IAP.prodId_PackagePrefix
let buildIndependant_obj = Environment.downloadManager
//get build specific constant &object
let buildspecific_var = Environment.Constants.appId
let buildspecific_obj = Environment.remoteConfig
}
В Android я настроил ту же систему, используя разные вкусы; У меня есть версия DEV, PROD и ACC, и я также могу включить тот же принцип, что и файл Environment.kt, скомпилированный только для определенных версий.
Однако я не могу найти эквивалентное решение для статических структур Swift в Kotlin, конечно, не в сочетании с расширениями.
Это то, что я до сих пор придумал:
sealed class Environment {
companion object {
const val name: String = "development"
fun start() {
//...some prod environment init code here
}
}
}
Как я могу реализовать эту постоянную иерархию и глобальную статику внутри Kotlin?