Android Kotlin 智能运算符重载
Android Kotlin smart operator overloading
如果重载一些 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
.
你可以这样做,但它不是很直观,因为 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)
如果重载一些 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
.
你可以这样做,但它不是很直观,因为 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)