#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. Черт, это неудобно. Определенно не стоит беспокоиться, вздох.