Как мне использовать перечисление в классе данных kotlin

#kotlin #enums #data-class

#kotlin #перечисления #класс данных

Вопрос:

У меня есть эта модель

 data class HourlyModel(
    val time: String,
    @DrawableRes val image: Int,
    val temp: Double
)
  

Я понял, что сервер предоставит мне коды погоды, которые преобразуются в значок, который будет отображаться. Я думаю, что если я добавлю @DrawableRes в перечисление, это может быть лучше, потому что у меня есть модель для сегодняшних прогнозов погоды и погоды на неделю.

Все 3 модели будут использовать одни и те же погодные коды. Я новичок в Kotlin, но я думаю, что если у меня есть класс enum, я смогу как-то использовать это в каждой модели

 enum class WeatherTypes (
    val weatherCode: Int,
    @DrawableRes val drawable: Int
) {
    SUNNY(0, R.drawable.sunny_t),
    RAIN(1,R.drawable.rain_t);
    
    companion object {
        fun weatherToImage(weatherCode: Int) = when(weatherCode) {
            0 -> SUNNY
            1 -> RAIN
            else -> SUNNY
        }
    }
}
  

Может кто-нибудь мне помочь и сказать, что я должен сделать с моей моделью, чтобы использовать этот класс enum для замены @DrawableRes ? если я не могу, то какой вариант лучше для меня?

Ответ №1:

Я предполагаю, что у вас разные модели для разных слоев. Допустим, у вас есть класс данных для данных, которые вы получаете с сервера.

 data class HourlyDto(
    val time: String,
    val weatherCode: Int,
    val temp: Double,
)
  

Ваша модель домена будет примерно такой:

 data class HourlyModel(
    val time: String,
    val weatherType: WeatherType,
    val temp: Double,
)
  

Я переработал ваш класс enum:

 enum class WeatherType(
    @DrawableRes val imageResId: Int,
) {
    SUNNY(R.drawable.sunny_t),
    RAIN(R.drawable.rain_t);

    companion object {
        fun from(weatherCode: Int): WeatherType {
            return WeatherType.values()[weatherCode]
        }
    }
}
  

Теперь вы можете сопоставить свою удаленную модель с моделью домена. Давайте создадим функцию расширения для этого (для примера. Возможно, вы делаете это по-другому)

 fun HourlyDto.mapToModel(): HourlyModel {
    return HourlyModel(
        time,
        WeatherType.from(weatherCode),
        temp
    )
}
  

Наконец, вы можете использовать вы можете получить свой идентификатор ресурса для рисования следующим образом:

 val hourlyWeather: HourlyModel = ...
hourlyWeather.weatherType.imageResId
  

Примечание: Это отвечает на вопрос о том, как использовать перечисление в вашем классе модели, но я предполагаю, что для решения этой конкретной проблемы вы могли бы использовать исходную модель (с идентификатором извлекаемого ресурса), а затем создать вспомогательную функцию, которая принимает weathercode и возвращает идентификатор извлекаемого ресурса и повторно использует его везде, где требуется.

Комментарии:

1. Почему вы удалили значение weatherCode: Int из WeatherTypes?

2. Я удалил его, потому что он такой же, как oridinal и для перечисления. Предоставленный вами код не показывает какого-либо конкретного использования weatherCode , у вас его нет в вашей исходной модели (первой). Это зависит от вас, в зависимости от функциональности вашего приложения вы можете поместить его в класс enum.

3. Черт, это неудобно. Определенно не стоит беспокоиться, вздох.