Запутался в возврате оператора when - PullRequest
1 голос
/ 12 июня 2019

Я перебираю кодовые метки Android от Google, создавая приложение для игры в кости, и меня немного смущает то, как тип возвращаемой функции моей функции getRandomDiceImage () имеет тип Int, но похоже, что функция возвращает ImageView.

Я понимаю, как получить случайное целое число и сохранить его в randomInt, и я получаю операторы 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 ]

2 голосов
/ 12 июня 2019

getRandomDiceImage () имеет тип Int, но похоже, что функция возвращает ImageView.

Нет, он возвращает images resource identifier, которые @DrawableRes int, такие как R.drawable.dice_1 и т. Д.

diceImage.setImageResource(getRandomDiceImage())

Хитрость заключается в том, что setImageResource( ожидает значение int (которое помечено @DrawableRes, чтобы гарантировать, что это на самом деле ресурс для рисования), основываясь на том, что ImageView загрузит ресурс растрового изображения, на который ссылается рисуемый идентификатор к.

1 голос
/ 12 июня 2019

Тип R.drawable.dice_1 на самом деле Int, а не ImageView.R - это статический класс, который содержит идентификаторы ресурсов (типа Int).Вы можете проверить реальное значение R.drawable.dice_1, нажав cmd (macOS) или ctrl (Windows) и поместив курсор на dice_1, и вы увидите, public static final int dice_1 = some_random_number этот some_random_number - это идентификатор, назначенный для drawable (image)ресурс во время процесса сборки.

Так что ваша функция getRandomDiceImage() : Int действительно возвращает Int тип.И diceImage.setImageResource(getRandomDiceImage()) действительно принимает в качестве аргумента id для drawable.

0 голосов
/ 12 июня 2019

Во-первых, вы используете функцию, чтобы определить, какое изображение кости вы будете использовать на основе генерируемого случайного числа.Обратите внимание, что 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 ожидает int resId, который вы передаете через выражение when.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...