解構
解構可以讓一個對象分解成多個變量,並且爲變量賦值
通常,函數的返回值中只能返回一個對象,而我們可能要返回很多的數據。此時就可以用到解構
首先定義一個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}") }