Android Kotlin умный оператор перегрузки - PullRequest
0 голосов
/ 08 марта 2019

Что если перегрузить некоторый оператор Kotlin и использовать его следующим образом:

// Inits somewhere before usage.
val someStrFromServer: String? 
lateinit var myFieldText: TextView

override fun onStart() {
    super.onStart()
    myFieldText.text = someStrFromServer / R.string.app_none
}

Перегрузка оператора:

operator fun String?.div(resId: Int): String {
    return if (this.isNullOrBlank()) {
        context.getString(resId)
    } else {
        this
    }
} 

Вывод, если someStrFromServer ноль:

D/DEBUG: None

Вывод, если someStrFromServer не нуль:

D/DEBUG: someStrFromServer

Кто-нибудь знает, если в Kotlin существует более эффективный и короткий путь ксправиться с этим?Возможно, даже больше, global , как extension function.

1 Ответ

2 голосов
/ 08 марта 2019

Вы можете сделать это, но это не очень интуитивно понятно, потому что div обычно используется только в математических вычислениях.Я бы порекомендовал использовать что-то вроде

someStrFromServer.takeUnless { it.isNullOrBlank()} ?: context.getString(resId)

или упрощенное расширение

fun String?.fallback(resId: Int) = takeUnless { it.isNullOrBlank()} ?: context.getString(resId)

, используемое так:

myFieldText.text = someStrFromServer.fallback(R.string.app_none)
...