《在飞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语言,希望我的博客对你有帮助!

源码在下一章中一起提供

猜你喜欢

转载自blog.csdn.net/pangzaifei/article/details/85118937