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语言,希望我的博客对你有帮助!
源码在下一章中一起提供