Я бы разделил чек на отдельную функцию.Это не только упрощает логику, но и позволяет дать ей описательное имя.И он хорошо подходит в качестве функции расширения для String:
fun String.isTitleCase()
= isNotEmpty() && this[0].isUpperCase() && drop(1).all{ it.isLowerCase() }
Это означает, что String
является регистром заголовка, если он не пустой, его первый символ является заглавным, и все символы, кроме первогострочные.(Если вы хотите обрабатывать лигатуры, вы также должны проверить isTitleCase()
на первом символе, а также isUpperCase()
.)
(Конечно, вы можете написать это как стиль блока,многострочная функция, возможно, с циклом и return
с - но когда все остальное равно, я предпочитаю более короткую версию!)
Тогда ваш основной код не должен беспокоиться о том, как выполняется проверкаи становится проще:
while (true) {
println("Enter a name:")
val name = readLine()
if (name != null && name.isTitleCase()) {
// Do stuff
break
} else {
println("olha nao da")
}
}
(я заменил !!
пустой проверкой, что намного безопаснее. Я также изменил цикл do
… while
на while
цикл с break
, чтобы избежать повторения проверки. И нет необходимости звонить toString()
, так как readLine()
уже дает вам String
или null
.)