《在飛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語言,希望我的部落格對你有幫助!
原始碼在下一章中一起提供