美文网首页
Kotlin扩展

Kotlin扩展

作者: xu_pan | 来源:发表于2020-10-20 20:19 被阅读0次
    package com.hand.test
    
    fun main(args: Array<String>) {
        val list = mutableListOf(1, 2, 3)
        list.swap(0, 2)
        println("list.swap(0,2):$list")
        val str = "1234"
        println("lastChar is ${str.lastChar}")
        Jump.print("1234567")
        testLet("123")
        testLet(null)
        testApply()
    }
    
    //方法扩展
    fun MutableList<Int>.swap(index1: Int, index2: Int) {
        val temp = this[index1]
        this[index1] = this[index2]
        this[index2] = temp
    }
    
    //泛型扩展方法
    fun <T> MutableList<T>.swap2(index1: Int, index2: Int) {
        val temp = this[index1]
        this[index1] = this[index2]
        this[index2] = temp
    }
    
    //扩展属性
    //为String添加一个lastChar属性,用于获取字符串的最后一个字符
    val String.lastChar: Char get() = this.get(this.length - 1)
    
    //伴生对象扩展
    class Jump {
        companion object {}
    }
    
    fun Jump.Companion.print(str: String) {
        println("jump $str")
    }
    
    /*
    *let扩展
    */
    fun testLet(str: String?) {
        //避免为null的操作
        str?.let {
            println(it.length)
        }
        //限制作用域
        str.let {
            val str2 = "let作用域"
        }
    }
    
    
    data class Room(val address: String, val price: Float, val size: Float)
    
    /*
    *run扩展
    * 函数原型 fun<T,R> T.run(f: T.() -> R):R = f()
    * run函数只接收-个lamda函数作为参数,以闭包形式返回,返回值为最后一行的值或者指定的return的表达式,
    * 在run函数可以直接访问实例的公有属性和公有方法
    */
    fun testRun(room: Room) {
        /*room.address
        room.price
        room.size*/
        //在run的代码块里可以直接访问其属性
        room.run {
            println("Room:$address,$price,$size")
        }
    }
    
    /*
    *apply 扩展
    * 函数原型
    * fun<T> T.apply(f: T.()->Unit):T{f();return this}
    * apply函数的作用是:调用某对象的apply函数,在函数范围内,可以任意调用该对象的任意方法
    * 并返回该对象。类似于Builder
    */
    
    fun testApply() {
        ArrayList<String>().apply {
            add("1")
            add("2")
        }.let {
            println(it)
        }
    }
    
    /*------案例:使用Kotlin扩展为控件绑定监听器减少模版代码------*/
    //为Activity添加find扩展方法,用于通过资源id获取控件
    fun <T : View> Activity.find(@IdRes id: Int): T {
        return findViewById(id)
    }
    
    //为Int添加onClick扩展方法,用于为资源id对应的控件添加onClick监听
    fun Int.onClick(activity: Activity, click: () -> Unit) {
        activity.find<View>(this).apply{
            setOnClickListener{
                click()
            }
        }
    
    }
    

    相关文章

      网友评论

          本文标题:Kotlin扩展

          本文链接:https://www.haomeiwen.com/subject/fhcjmktx.html