статический объект среды, зависящий от построения транскод от swift до kotlin - PullRequest
0 голосов
/ 01 ноября 2018

В 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?

1 Ответ

0 голосов
/ 03 ноября 2018

Перепробовав разные варианты, я, наконец, выбрал следующую реализацию:

open class RootEnvironment {

    open class Constants {
        val maxBreak = 147
        val unInitializedId = "unInitializedId"
        val userLanguageKey = "userlanguage"
        val demoUserName = "John Smith"

        open class IAP {
            val prodId_PackagePrefix = "net.sample.com"
            val prodId_Package_Custom = "net.sample.com"
        }

    }

    open fun start() {
        Log.debug("Starting root environment")
    }

}

object Environment : RootEnvironment() {

    const val name: String = "development"

    object WebService {
        val url = "https://xxxxx"
    }

    object Constants : RootEnvironment.Constants() {
        val maxScreenshotsBeforeBuggingUser = 3

        object IAP : RootEnvironment.Constants.IAP()
    }

    override fun start() {
        super.start()
        Log.debug("Starting Environment <$name>")
    }
}

fun testEnvironment() {
    //call genaral constants
    Log.debug("maxBreak......................... ${Environment.Constants.maxBreak}")
    Log.debug("IAP.prodId_PackagePrefix......... ${Environment.Constants.IAP.prodId_PackagePrefix}")
    //environment specific
    Log.debug("name..............................${Environment.name}")
    Log.debug("maxScreenshotsBeforeBuggingUser...${Environment.Constants.maxScreenshotsBeforeBuggingUser}")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...