首页 Android正文

Kotlin扩展函数和扩展属性的详解

yuange Android 2020-12-28 1041 0 Kotlin扩展函数

Kotlin 可以对一个类的属性和方法进行扩展,对被扩展的类代码本身不会造成任何影响。

扩展函数可以为已经存在的类添加新的方法,并且不会修改原来的类。

扩展函数由一下几个模块组成:

//Type:表示要扩展的类//functionName:表示扩展函数的方法名fun  Type.functionName(){//扩展函数的逻辑}

具体使用可以看下面的例子,我们定义一个String类的扩展函数,tolenght()来获取字符串的长度。

//自定义扩展函数实现获取字符串的长度fun String.tolenght(): Int {
    return length}//具体使用方法,等价于  "张山".length"张山".tolenght()

扩展函数和普通函数一样也可以有参数和返回值的,比如下面这个我们定义一个list中添加对象,addBy(),向对于list.add()方法多了一个返回值,这样我们就可以采用链式调用了,具体代码:

//添加一个对象到集合中,并且返回这个集合fun <T> MutableList<T>.addBy(t: T): MutableList<T> {
    this.add(t)  
    return this //返回集合本身}
扩展属性
//自定义扩展属性,var <T> MutableList<T>.lastData: T    //获取集合中最后一个对象
    get() = this[this.size - 1]
    //设置集合中最后一个对象的值
    set(value) {
        this[this.size - 1] = value    }

具体用法,定义一个String类型的集合,然后通过lastData来改变或者获取集合中的最后一个对象

   val strs = mutableListOf<String>()
    strs.lastData = "dd"
    var mo = strs.lastData

自定义扩展属性不能设置初始值,且主要是通过get,set方法来获取或者修改属性的值。
另外,谷歌也推出了Kotlin KTX(就是把比较常用的一些代码块,利用kotlin扩展函数进行封装,然后在这个基础上,提供更良好的 API,供开发者使用 ),具体用法可以参考 android ktx
这里提供一个项目中用到的部分扩展函数代码:


//字符串转换成double
fun String.toDoubleNum(): Double {
    return if (this.isNotEmpty()) {
        try {
            this.toDouble()
        } catch (e: Exception) {
            0.0
        }
    } else {
        0.0
    }}
    //字符串转换成Int
    fun String.toIntNum(): Int {
    return if (this.isNotEmpty()) {
        try {
            this.toInt()
        } catch (e: Exception) {
            0
        }

    } else {
        0
    }}
    //字符转换泛型对象inline
     fun <reified T> String.toBean(): T {
    return GsonUtils.toBean(this, T::class.java)}
    //拼接多个字符串设置给textView
    fun TextView.setTexts(vararg strs: String) {
    val strBuffer = StringBuffer()
    for (str in strs) {
        strBuffer.append(str)
    }
    this.text = strBuffer.toString()}
    //设置网络图片
    fun ImageView.setImageUrl(url: Any, empty: Int) {
    GlideUtils.showNormalCenterCropImage(url, this, empty)}
    //判断是否网络图片
    fun String.isNetWorkImage(): Boolean {
    return this.contains("http:/") || this.contains("https:/")}
    //中间toast
    fun String.toastCenter() {
    ToastUtils.setGravity(Gravity.CENTER, 0, 0)
    ToastUtils.setBgColor(BaseLibraryApplication.getBaseApplication().resources.getColor(R.color.black_three))
    ToastUtils.setMsgColor(BaseLibraryApplication.getBaseApplication().resources.getColor(R.color.white))

    ToastUtils.showShort(this)}
    //底部toast
    fun String.toastBottom() {
    ToastUtils.setGravity(Gravity.BOTTOM, 0, 0)
    ToastUtils.setBgColor(BaseLibraryApplication.getBaseApplication().resources.getColor(R.color.black_three))
    ToastUtils.setMsgColor(BaseLibraryApplication.getBaseApplication().resources.getColor(R.color.white))
    ToastUtils.showShort(this)}//qmuiTipDialogfun String.showTipDialog(context: Context) {
    val tipDialog = QMUITipDialog.Builder(context)
        .setTipWord(this)
        .create(true)
    tipDialog.setCanceledOnTouchOutside(true)
    tipDialog.show()
    Timer().schedule(object : TimerTask() {
        override fun run() {
            tipDialog.dismiss()
        }
    }, 2000)}
    //修改文件名称
    fun String.modifierFileName(): String {
    var fileNames = this.split(".")
    if (fileNames.size == 2) {
        return fileNames[0] + TimeUtils.getNowMills() + "." + fileNames[fileNames.size - 1]
    } else {
        return this
    }}

评论

在线客服-可直接交谈

您好!有什么需要可以为您服务吗?