I have this code:
statisticsSettings = when (ScreenHandler.convertPixelsToDp(width, context).toInt()){
320 -> StatisticsSettings.SMALL_PHONE
480 -> StatisticsSettings.LARGE_PHONE
600 -> StatisticsSettings.SMALL_TABLET
720 -> StatisticsSettings.LARGE_TABLET
else -> throw IllegalArgumentException("Cannot compute dp")
}
and I was wondering if I could make cases of the when
statement with a comparator instead of an integer. Something like this:
statisticsSettings = when (ScreenHandler.convertPixelsToDp(width, context).toInt()){
ScreenHandler.convertPixelsToDp(width, context).toInt()) < 320 -> StatisticsSettings.SMALL_PHONE
ScreenHandler.convertPixelsToDp(width, context).toInt()) < 480 -> StatisticsSettings.LARGE_PHONE
ScreenHandler.convertPixelsToDp(width, context).toInt()) < 600 -> StatisticsSettings.SMALL_TABLET
ScreenHandler.convertPixelsToDp(width, context).toInt()) < 720 -> StatisticsSettings.LARGE_TABLET
else -> throw IllegalArgumentException("Cannot compute dp")
}
CodePudding user response:
Use ranges:
val statisticsSettings = when (ScreenHandler.convertPixelsToDp(width, context).toInt()){
in 0..320 -> StatisticsSettings.SMALL_PHONE
in 321..480 -> StatisticsSettings.LARGE_PHONE
in 481..600 -> StatisticsSettings.SMALL_TABLET
in 601..720 -> StatisticsSettings.LARGE_TABLET
else -> throw IllegalArgumentException("Cannot compute dp")
}
Or you could use enum constants:
enum class StatisticsSettings(val intRange: IntRange) {
SMALL_PHONE(0..320),
LARGE_PHONE(321..480),
SMALL_TABLET(481..600),
LARGE_TABLET(601..720)
}
val intRange = ScreenHandler.convertPixelsToDp(width, context).toInt()
val statisticsSettings = StatisticsSettings.values().find { intRange in it.intRange }
This has the advantage that the ranges are "bound" to the enum itself. If you ever change these values, you don't have to change them on possibly multiple locations in your code.
Edit: switched from filter to find (thanks to @ArpitShukla, see comment below)