Kotlin---解構與委託

解構

解構可以讓一個對象分解成多個變量,並且爲變量賦值

通常,函數的返回值中只能返回一個對象,而我們可能要返回很多的數據。此時就可以用到解構

首先定義一個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}")
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章