首页 > 解决方案 > Android Kotlin 智能算子重载

问题描述

如果重载某个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存在更有效和更短的方法来处理这个问题?也许,甚至更多,全球性的,比如extension function.

标签: androidkotlinoperator-overloadingandroid-resources

解决方案


你可以这样做,但它不是很直观,因为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)

推荐阅读