问题描述
我有这个模特
data class HourlyModel(
val time: String,@DrawableRes val image: Int,val temp: Double
)
我意识到服务器将为我提供天气代码,这些天气代码将转换为将显示的图标。我认为,如果将@DrawableRes放入枚举,可能会更好,因为我有一个“今日天气”和“每周天气”预测的模型。
所有3个型号将使用相同的天气代码。 我是Kotlin的新手,但是我认为,如果我有一个枚举类,我应该能够在每种模型中以某种方式使用
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
}
}
}
有人可以帮助我并告诉我使用该枚举类替换@DrawableRes应该对我的模型做什么吗?如果不能,那么对我来说最好的选择是什么?
解决方法
我假设您对不同的图层使用不同的模型。假设您有一个从服务器接收的数据的数据类。
data class HourlyDto(
val time: String,val weatherCode: Int,val temp: Double,)
您的域模型将如下所示:
data class HourlyModel(
val time: String,val weatherType: WeatherType,)
我重构了您的枚举类:
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
)
}
最后,您可以使用像这样获得您的可绘制资源ID:
val hourlyWeather: HourlyModel = ...
hourlyWeather.weatherType.imageResId
注意:这回答了如何在模型类中使用枚举的问题,但是我想要解决此特定问题,您可以使用原始模型(带有drawable resource-id)然后创建一个辅助函数,它接受weathercode
并返回可绘制的资源ID,并在需要的地方重复使用。