Android Kotlin智能运算符重载

时间:2019-03-08 07:59:17

标签: android kotlin operator-overloading android-resources

如果重载某些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这样的 global

1 个答案:

答案 0 :(得分:2)

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