Kotlin支持?jǐn)U展函數(shù)和擴(kuò)展屬性,它提供了擴(kuò)展新功能類的能力,而不需要從類繼承或使用任何類型的設(shè)計模式,僅僅通過擴(kuò)展申明即可完成。
1.擴(kuò)展函數(shù)
1.1定義
擴(kuò)展函數(shù)是靜態(tài)解析的,它并不會對它擴(kuò)展的類產(chǎn)生任何影響,即通過定義擴(kuò)展函數(shù),它并不會對擴(kuò)展類產(chǎn)生任何成員變量或?qū)傩?,但是卻表現(xiàn)的就像是擴(kuò)展類的方法一樣。
上面這句話是不是還是感到有點抽象?我簡單概括一下:當(dāng)一個類所提供的public方法不足以解決我們開發(fā)的需求,或此類的某些方法在很多地方使用具有相似性,我們可以使用擴(kuò)展函數(shù)簡化這些操作,類似于Java中的Utils類提供的靜態(tài)方法。
1.2舉例
下面簡單舉例:
//ImageView拓展函數(shù)
fun ImageView.url(url: String?, circle: Boolean = false, errorRes: Int = R.mipmap.ic_error,
holderRes: Int = R.mipmap.ic_holder) {
val drawableRequest = Glide.with(context)
.load(url)
.placeholder(holderRes)
.error(errorRes)
if (circle) drawableRequest.bitmapTransform(CropCircleTransformation(context))
drawableRequest.into(this)
}
//調(diào)用
imageView.url("xxx")
imageView.url("xxx",circle = true)
imageView.url("xxx",errorRes=R.mipmap.xxxx)
這里通過Glide為ImageView設(shè)置url圖片,它包括了是否取圓,占位圖,加載錯誤圖等等,只有url是必須傳入的,其它值均有默認(rèn)值,可不傳。調(diào)用時僅一句代碼即可完成,方便快捷,且不會對原有擴(kuò)展類ImageView產(chǎn)生任何影響,僅通過靜態(tài)編譯產(chǎn)生擴(kuò)展函數(shù)而已。
下面再舉個小例子,如開發(fā)金融類app,經(jīng)常需要對Double類型的數(shù)字進(jìn)行小數(shù)點后幾位取舍,那么使用擴(kuò)展函數(shù)就極為方便了,如字符串“剩余金額8888.88元”,“歷史年化10.8%”等。
//Double擴(kuò)展函數(shù)
fun Double.nail(nail: Int = 2, prefix: String = "", suffix: String = "")
= "$prefix${String.format("%.${nail}f", this)}$suffix"
//調(diào)用(此處文字就不放strings里面了)
8888.88777.nail(prefix="剩余金額",suffix="元")
10.88.nail(nail = 1,prefix="歷史年化",suffix="%")
看了上面的示例,是不是很簡單?沒錯,kotlin擴(kuò)展函數(shù)就是這么簡單方便。
2.擴(kuò)展屬性
//為View設(shè)置左內(nèi)邊距
var View.leftPadding: Int
set(value) {
setPadding(value, paddingTop, paddingRight, paddingBottom)
}
get() = leftPadding
//調(diào)用
view.leftPadding = Util.dip2px(5)
至此,kotlin擴(kuò)展函數(shù)與擴(kuò)展屬性已全部完成。