解构
解构可以让一个对象分解成多个变量,并且为变量赋值
通常,函数的返回值中只能返回一个对象,而我们可能要返回很多的数据。此时就可以用到解构
首先定义一个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}")
}
网友评论