Kotlin的几个扩展函数

19-01-02 banq
         

Kotlin有一个名为“扩展函数”的好功能- 为现有类添加新功能,无需继承或编写大量样板代码。Kotlin允许扩展函数和扩展属性。

下面是一个Float类的扩展,通过添加一个新函数来调用asDollars()浮点数作为货币值:

fun Float?.asDollars() = "USD%.2f".format(this ?: 0.0F)

在代码中可以调用:

val money = 42.0F
println( money.asDollars() ) // will print "USD42.00"

注意:扩展函数不会真正修改现有类。相反,接收器对象在编译期间作为第一个参数传递。有关更多信息,请参阅:扩展函数是静态解析的

以下是我在Android中的许多项目中使用的一些自己的扩展:

1.AlertDialogs

fun Context.showAlertDialog(
    title: String,
    message: String,
    ok: Pair<String,()->Unit>,
    cancel: Pair<String,()->Unit>? = null){

    val builder = AlertDialog.Builder(this)
        .setTitle(title)
        .setMessage(message)
        .setCancelable(false)
        .setPositiveButton(ok.first) { _,_ -> ok.second() }

    cancel?.let{
        builder.setNegativeButton(it.first) { _, _ -> it.second() }
    }

    builder.create().show()
}

fun Context.showConfirmDialog(
    title: String,
    message: String,
    ok: Pair<String,()->Unit>,
    cancel: Pair<String,()->Unit>? = null
) = showAlertDialog(title, message, ok, cancel)

fun Context.showErrorDialog(message: String, action: () -> Unit){
    showAlertDialog(
        title = "Error",
        message = message,
        ok = "OK" to action
    )
}

调用:

fun onResume(){
    showAlertDialog(
        title = "Welcome",
        message = "Hello, welcome to the show! Do you want to proceed?",
        ok = "Yes" to { nextScreen() },
        cancel = "No" to { finish() }
    )

    // showing an error
    showError("No internet connection. Please try later") { finish() }
}

2.一个简单的点击监听器

inline fun View.onClick(crossinline f: ()-> Unit) = this.setOnClickListener { f() }

用法:

btnNext.onClick { nextScreen() }

3.EditText验证

fun isValidText(s: String?) = s!=null && !s.isEmpty()
fun isValidEmail(s: String?) = isValidText(s) &&  android.util.Patterns.EMAIL_ADDRESS.matcher(s).matches()

fun EditText.trimmedText() = this.text?.trim().toString()
fun EditText.isValidText() = isValidText(this.trimmedText())
fun EditText.isValidEmail() = isValidEmail(this.trimmedText())

用法:

isValidForm = editEmail.isValidEmail() && editUsername.isValidText()