如何在Kotlin数据类中使用枚举

问题描述

我有这个模特

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,并在需要的地方重复使用。