美文网首页
Kotlin---解构与委托

Kotlin---解构与委托

作者: None_Ling | 来源:发表于2018-11-06 15:13 被阅读9次

    解构

    解构可以让一个对象分解成多个变量,并且为变量赋值

    通常,函数的返回值中只能返回一个对象,而我们可能要返回很多的数据。此时就可以用到解构

    首先定义一个Date类,使用data进行修饰,因为使用data修饰后,可以为这个类提供component1()component2()等函数。如果不用data修饰的话,那么需要手动添加component函数。

    因为解构就是通过component为变量赋值的

    data class Date(var year: Int = 10,
                    var month: Int,
                    var day: Int) {
    
        fun getThis():Date{
            return this
        }
    }
    

    定义完结构体后,就可以使用解构了

    var (year, month, day) = Date(2018, 1, 1)
    var (y, m, d) = date.getThis()
    

    如果有某个变量不需要使用的话,则可以使用_跳过

    var (y, _, d) = date.getThis()
    

    委托

    Kotlin中通过by关键字来将属性/函数委托给其他对象完成。

    委托属性

    通常我们使用var来定义属性以及它的初始化值,并且提供set/get方法以供外部使用。但是通过委托,可以将属性的set/get委托给其他的对象来完成。

    class Product {
        var x: String by StringDelegate()
    }
    
    class StringDelegate {
        operator fun getValue(product: Product, property: KProperty<*>): String {
            Log.e("StringDelegate", "This is getValue from StringDelegate")
            return product.x
        }
    
        operator fun setValue(product: Product, property: KProperty<*>, s: String) {
            Log.e("StringDelegate", "This is setValue from StringDelegate")
            product.x = s
        }
    }
    

    通过以上代码,就可以将x变量的set/get方法委托给StringDelegate类来实现。operator关键字必须有。

    Observable委托

    kotlin中的Delegates提供了observable的工厂,能够提供属性变化的回调

    class Product {
        var x: String by Delegates.observable("not initialize") { property, oldValue, newValue ->
            Log.e("Observable", "Property:${property.name}...OldValue:$oldValue...NewValue:$newValue")
        }
    }
    

    当属性的值发生变化的时候,则会执行observable中的onchange回调

    属性映射

    通常在Json数据结构中出现K-V的Map,而Kotlin中可以通过委托的方式将map中的Value委托给对应的值。其中属性只能使用val来定义,使用var将报错。

    class Product(map: Map<String, Any>) {
        val name: String by map
        val age: Int by map
    }
    
    fun main() {
        var map: Map<String, Any> = mapOf("name" to "bob", "age" to 18)
        var product = Product(map)
        Log.e("Product", "Name:${product.name}...Age:${product.age}")
    }
    

    相关文章

      网友评论

          本文标题:Kotlin---解构与委托

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