Как безопасно привести результат readLine (), чтобы предотвратить несоответствие типов, используя Kotlin - PullRequest
1 голос
/ 07 января 2020

Многие Kotlin учебники, которые я смотрел / читал, имеют следующую строку кода:

var number = Integer.valueOf(readLine())

И хотя раньше это явно работало, теперь он выдает ошибку компилятора при использовании Android studio и Kotlin версия 1.3.50. Это указывает на несоответствие типов, когда найденное значение равно String?, а требуемое значение равно String.

Конечно, я понимаю , почему это происходит, я получаю, что пользователь может передавать через консоль нулевые или пустые значения, и поэтому ему необходимо иметь необязательное объявление нулевого значения, но я бы нравится понимать, как исправить ошибку компилятора и сохранить подобный код, не меняя слишком много.

Хотя я могу использовать обе эти строки кода:

var number = Integer.valueOf(readLine()!!)

и

var number = Integer.valueOf(readLine() as String)

Я считаю, что они могут выдавать различные исключения, как указано здесь

Я знаю, что могу решить эту проблему с помощью этого кода:

var number : String? = readLine();
if(number == null){
    number = "0"
}
val number2 = Integer.valueOf(number);

Но это кажется ужасно неэффективным. Есть ли более короткий способ сделать это, используя собственный код Kotlin?

Ответы [ 2 ]

4 голосов
/ 07 января 2020

Если мы просто вызовем toInt() для результата из readLine(), мы получим исключение, если предоставленное значение не является действительным целым числом. Чтобы избежать исключения, мы можем использовать toIntOrNull() из Kotlin Стандартной библиотеки.

val x= readLine()?.toIntOrNull() ?: 0

В этом случае мы читаем строку (как String?), и если она не -Ну, звоните toIntOrNull() на это. Если , что не равно нулю, у нас есть наш ответ. В противном случае мы используем 0 по умолчанию.

2 голосов
/ 07 января 2020

Несмотря на то, что я в основном разработчик Swift, это очень похожая концепция. В Swift это называется оператором с нулевым слиянием, но, по-видимому, в Kotlin он называется оператором Элвиса (угу).

Документы здесь Так что ваш код будет выглядеть например:

var num : String = readLine() ?: "0";

Если значение перед оператором Элвиса ?: не равно нулю, оно использует его, в противном случае оно использует второе заданное вами значение по умолчанию.

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