1. 程式人生 > >《在飛Android Kotlin快速入門-apply{}、with{}及原理分析篇3》

《在飛Android Kotlin快速入門-apply{}、with{}及原理分析篇3》

hi各位親,這章主要說下開發中常用到apply()、with()。

       這幾個方法在Android開發中經常用到的地方是:使用同一個物件的多個方法的時候。可以不用分開寫,全部放到apply{}with{}中。

一:apply{}

   上面是applay的原始碼,我們解讀下方法體中的具體含義:

     <T> T.apply:<T>是指泛型,任意型別,比如String。T.apply():是這個T的擴充套件函式,意思是T支援apply()函式。

     (block:T.()->Unit):函式型別,但是和前面說的不大一樣的地方就是T.()。如果 不加T,例如(block:()->Unit)我們就很容易看出是個函式,T.()的意思是在T裡面的函式。

     ():T    :返回的是T。

   舉個例子:

    //第一種 普通函式 b
    fun getA(test:()->Unit){
    }
    //呼叫getA
    fun useGetA(){
        getA {

        }
    }
    //第一種 普通函式 e

    //第二種 用T.()的內部函式 b
    fun getB(test:C.()->Unit){
        //在裡面還以直接使用C中的方法d()
        C().d()
    }
    fun useGetB(){
        getB {
            //這個時候裡面多了this引數,this指向的是C這個類
            this.d()
        }
    }
    class C {
        var params = "p"
        fun d(){

        }
    }
    //第二種 用T.()的內部函式 e

   

 

         Android中的例子:比如有一個Button,點選調轉到另一個頁面,但是需要intent中put多個值。Kotlin中的多次操作一個物件可以用apply{}。例如下面的budle.apply{} 轉載請註明出處:https://blog.csdn.net/pangzaifei/article/details/85118937

 offerwall.setOnClickListener {

            var offerWallIntent = Intent(this, OfferWallAct::class.java)
            var bundle = Bundle()
            bundle.apply {//使用apply{}讓封裝成一組操作
                putInt("pid", 61709);
                putInt(OfferWallAct.KEY_TITLE_ID, R.string.app_name); // 可選
                putString(OfferWallAct.KEY_TAB_BACKGROUND_COLOR, "#EDEDED"); // 可 選
                putString(OfferWallAct.KEY_TAB_INDICATOR_COLOR, "#1C86EE"); // 可選
                putString(OfferWallAct.KEY_TAB_TEXT_COLOR, "#000000"); // 可選
            }

            offerWallIntent.putExtras(bundle)
            startActivity(offerWallIntent)
        }

 

二:With{}

     上面是with的原始碼,我們解讀下方法體中的具體含義:

       <T,R> with():<T,R>泛型,引數是兩個 with方法名。

       with(receiver:T,block:T.()->R):需要兩個引數,第一個是receiver型別是T,第二個是T.中的函式型別,接收者是R型別。

    ():R    :with函式的返回值是R。

舉個例子:

 fun testWith() {
        var d = with("abc") {
            var c = C() //如果最後一行是c,那麼上面var d的型別是unit
            "a"//如果最後一行是"a",那麼上面var d的型別是String
            1//如果最後一行是數字1,那麼上面var d的型別是int
        }
    }

三:with{}與apply{}的區別

    1.apply{}必須依託於一個T物件。

 var aaa= arrayListOf<String>().apply {}

    2.with{}不需要依託,可以單獨存在,可以在class外使用。https://blog.csdn.net/pangzaifei/article/details/85118937

class A{
//fun中使用 
fun testWith() {
        var d = with("abc") {
            var c = C() //如果最後一行是c,那麼上面var d的型別是unit
            "a"//如果最後一行是"a",那麼上面var d的型別是String
            1//如果最後一行是數字1,那麼上面var d的型別是int
        }
    }
//類中使用
  class e {
        var ccc = with("abc") {}
    }
}


//在class外使用
var ccc = with("abc") {}

   

Ps:我是在飛,只有空閒時間才能更新部落格,所以本系列偏快速入門,主要講實戰中經常用到內容,讓你快速上手。所以文章儘量簡短,敬請諒解,本系列文章預設閱讀者已經熟悉java語言,希望我的部落格對你有幫助!

原始碼在下一章中一起提供