首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kotlin---解构与委托

Kotlin---解构与委托

作者头像
None_Ling
发布2018-12-07 11:09:34
5950
发布2018-12-07 11:09:34
举报
文章被收录于专栏:Android相关Android相关Android相关

解构

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

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

首先定义一个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}")
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解构
  • 委托
  • 委托属性
    • Observable委托
    • 属性映射
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档