Kotlin---解构与委托

2018-11-06  本文已影响9人  None_Ling

解构

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

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

首先定义一个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}")
}
上一篇下一篇

猜你喜欢

热点阅读