困惑于返回when语句

时间:2019-06-12 16:48:42

标签: android kotlin

我正在遍历Google的Android代码实验室,构建一个骰子滚轴应用程序,并对我的函数getRandomDiceImage()的返回类型如何为Int类型感到有些困惑,但似乎该函数正在返回ImageView。

我了解获得一个随机整数并将其存储在randomInt中,并且获得了像标准C语言一样的switch语句。但是,将该randomInt转换为R.drawable.image会让我失望。

private fun getRandomDiceImage(): Int {
    val randomInt = Random().nextInt(6) + 1

    return when (randomInt) {
        1 -> R.drawable.dice_1
        2 -> R.drawable.dice_2
        3 -> R.drawable.dice_3
        4 -> R.drawable.dice_4
        5 -> R.drawable.dice_5
        else -> R.drawable.dice_6
    }

}

private fun rollDice() {
    diceImage.setImageResource(getRandomDiceImage())
    diceImage2.setImageResource(getRandomDiceImage())
}

3 个答案:

答案 0 :(得分:2)

  

getRandomDiceImage()的类型为Int,但似乎函数正在返回ImageView。

否,它将返回images resource identifier,例如@DrawableRes intR.drawable.dice_1

  

diceImage.setImageResource(getRandomDiceImage())

诀窍在于,setImageResource(期望一个int值(用@DrawableRes注释以确保它实际上是可绘制的资源)是基于ImageView将加载位图的可绘制标识符所引用的资源。

答案 1 :(得分:1)

R.drawable.dice_1的类型实际上是Int,而不是ImageViewR是一个静态类,其中包含资源ID(类型为Int)。 您可以通过按cmd(macOS)或ctrl(Windows)并将光标放在R.drawable.dice_1上来检查dice_1的实际值,您会看到public static final int dice_1 = some_random_number这个some_random_number是分配的ID在构建过程中使用可绘制(图像)资源。

因此,您的函数getRandomDiceImage() : Int确实返回了Int类型。 并且diceImage.setImageResource(getRandomDiceImage())确实将id当作可绘制对象的参数。

答案 2 :(得分:0)

首先,您正在使用该函数根据生成的随机数来确定要使用的骰子图像。请注意,when还可以用作表达式或语句。

val drawableResource = when (randomInt) {
    1 -> R.drawable.dice_1
    2 -> R.drawable.dice_2
    3 -> R.drawable.dice_3
    4 -> R.drawable.dice_4
    5 -> R.drawable.dice_5
    else -> R.drawable.dice_6
}

diceImage.setImageResource(drawableResource)

setImageResource期望您通过when表达式传递的int resId