Kotlin的幾個擴充套件函式

banq發表於2019-01-02

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()

相關文章