Kotlin擴展函數與高階函數-實際應用
概述
關於kotlin擴展函數與高階函數,網上有很多相關的資料介紹,包括官方文檔上也有詳細的說明。咱們就不再重複理論的介紹,通過一個簡單的應用場景來看看如何使用。
擴展函數
不通過繼承或使用 Decorator 模式,在已有類中添加新的方法,來實現某一具體功能。
高階函數
將函數作為參數或返回一個函數,稱為高階函數。
應用場景
當任意一個輸入框為空時,「註冊」按鈕為不可用狀態。
當所有輸入框都不為空時,「註冊」按鈕為可用狀態。
場景分析
- 首先,需要監聽所有輸入框的輸入變化;
- 其次,需要判斷所有輸入框是否都不為空;
- 最後,根據判斷,設置「註冊」按鈕狀態;
根據我們的分析,按照傳統方式,我們需要同時給4個輸入框添加TextWatcher,並且每個都需要判斷其它幾個輸入框是否為空,再來設置按鈕。
但是,我們使用的是kotlin,既然最終改變的是按鈕的狀態,那我們就可以給按鈕擴展一個方法,來設置它的狀態,設置的依據通過擴展方法的參數傳入(高階函數)。
擴展方法代碼
fun Button.enable(et: EditText, method: () -> Boolean){ val btn = this et.addTextChangedListener(object : TextWatcher{ override fun afterTextChanged(s: Editable?) { } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { btn.isEnabled = method() } })}
以上代碼,
- Button擴展了一個方法enable;
- 第一個參數EditText,因為需要監聽它的變化;
- 第二個參數是方法,方法的作用就是判斷是否所有輸入框都不為空,返回值是Boolean;
- 在EditText監聽中動態設置按鈕是否可用;
判斷方法代碼
private fun isBtnEnable():Boolean{ return mMobileEt.text.isNotEmpty() && mVerifyCodeEt.text.isNotEmpty() && mPwdEt.text.isNotEmpty()&& mConfirmPwdEt.text.isNotEmpty() }
以上代碼,當所有輸入框都不為空時,返回true;否則,返回false
使用擴展方法
mRegisterBtn.enable(mMobileEt,{isBtnEnable()}) mRegisterBtn.enable(mVerifyCodeEt,{isBtnEnable()}) mRegisterBtn.enable(mPwdEt,{isBtnEnable()}) mRegisterBtn.enable(mConfirmPwdEt,{isBtnEnable()})
以上代碼,在初始化的時候,調用擴展方法,使用Lambda傳入方法參數。
小結
合理的使用擴展方法,可以極大程度地減少代碼量,並且邏輯也會很清晰,在需要的地方配合高階函數,事半功倍。
這只是一個簡單場景應用,更多精彩《Kotlin打造完整電商APP》
作者: 雷宇_
鏈接:https://www.imooc.com/article/22500來源:慕課網本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作
推薦閱讀:
※插入迭代器inserter在copy函數的運行機制是什麼?
※為什麼單機遊戲的啟動時間一般都比較長?有沒有辦法進行縮短?
※從零開始寫個編譯器吧 - tao 語言的文法定義(下)
※代碼里寫很多if會影響效率嗎?