Генерация объекта настроек Swift + Java из JSON во время компиляции - PullRequest
0 голосов
/ 20 сентября 2018

Мое мобильное приложение содержит довольно много жестко запрограммированных данных, которыми я хочу поделиться с нативными версиями приложения для Android и iOS.Я не хочу создавать два файла настроек для каждого приложения: я хотел бы иметь одно место, где хранится информация.

Первой мыслью было использование файла JSON, встроенного в мое приложение, и декодирование его ввремя выполнения.

Вместо этого моя цель здесь - десериализовать данные приложения во время компиляции, чтобы:

  • отслеживать потенциальные ошибки в файле JSON или коде декодирования перед отправкой приложения: сборка не удастся вместо
  • избежать замедления некоторой десериализацией во время запуска
  • избежать сохранения незашифрованных данных приложения в виде файлов JSON (.ipa / .apk - это zip-файлы, где ресурсы могутбыть легко извлеченным), я бы лучше запутал его в коде

Я ищу инструмент командной строки, который я мог бы добавить в свои сценарии сборки, которые дали бы файлу JSON вывод схемы и таким образомКлассы AND создают объект со всеми настройками приложения.

Например, с учетом следующего файла settings.json:

{
    "gravity": 9.81,
    "scientists": ["Kepler", "Einstein", "Newton"],
    "planets": [
        {
            "name": "Mars",
            "radius": 3390
        },
        {
            "name": "Venus",
            "radius": 6052
        }
    ]
}

I woВы хотели бы автоматически генерировать файл Settings.swift, который может выглядеть следующим образом:

struct Settings {

    struct Planet {
        var name: String
        var radius: Int
    }

    var gravity: Double
    var scientists: [String]
    var planets: [Planet]

    static func content() -> Settings {
        return Settings(gravity: 9.81, scientists: ["Kepler", "Einstein", "Newton"], planets: [Planet(name: "Mars", radius: 3390), Planet(name: "Venus", radius: 6052)])
    }
}

Затем я могу включить сгенерированный файл в мой проект и один раз вызвать Settings.content (), сохранить его в глобальной переменной ииспользуйте его в моем проекте.

Я хочу добиться того же с Android.

Такие инструменты, как quicktype или json2swift, выполняют половину работы и не генерируют бит создания объекта, который до сих порнужно сделать во время выполнения.

Есть идеи?

1 Ответ

0 голосов
/ 20 сентября 2018

Возможное решение будет следующим:

  1. Сохраните файл .json в каталоге проекта
  2. В AppDelegate applicationDidFinishLauncing () прочитайте указанный выше файл в объект данных ( Чтение файла JSON с помощью Swift 3 )
  3. Заставить ваш класс Settings реализовать Decodable (ваш внутренний класс также должен будет реализовать Decodable)
  4. Вызвать JsonDecoder (). Decode () и предоставьте данные, которые вы получили в 2)
  5. Затем вы можете сохранить это значение в любом месте

Я только что заметил, что вам нужно, чтобы генерация произошла, когда Settings.content ()называется.Выполните вышеуказанные шаги, просто переместите шаг 2) в функцию content ()

...