繁体   English   中英

MutableMap如何 <String, Any?> 在Kotlin中使用委托将值传递给var时?

[英]How does MutableMap<String, Any?> pass value to var when I use delegate in Kotlin?

以下示例代码来自网页。 我了解这些var _id,城市和国家/地区会通过代表获得价值。

我不明白地图如何:MutableMap将值传递给这些vars _id,城市和国家/地区?

我必须先传递这些键的值才能进行映射吗? 例如map [“ _ id”] = 132L,map [“ city”] =“ Wuha”和map [“ country”] =“ USA”?

如果没有map [“ _ id”]怎么办? 代码var _id: Long by map会导致错误吗?

class CityForecast(val map: MutableMap<String, Any?>, val dailyForecast: List<DayForecast>) {
    var _id: Long by map
    var city: String by map
    var country: String by map

    constructor(id: Long, city: String, country: String, dailyForecast: List<DayForecast>)
        : this(HashMap(), dailyForecast) {
        this._id = id
        this.city = city
        this.country = country
    }
}

首先,您需要了解委派属性的工作方式。 对象不直接拥有委​​托的属性。 它仅拥有委托。 例如, var _id: Long by map实际上看起来像

var _id: Long
    get() {
        val value = map["_id"] as? Long
        if (value == null)
            throw Excecption()
        return value        
    }
    set(value) {
        map["_id"] = value
    }

我必须先传递这些键的值才能进行映射吗? 例如map [“ _ id”] = 132L,map [“ city”] =“ Wuha”和map [“ country”] =“ USA”?

不,这是一个运行时检查,就像lateinit一样。

如果没有map [“ _ id”]怎么办? 代码var _id:长按地图会导致错误吗?

当然,会有例外。

请注意, 建议普通班级使用。 它是为JSON反序列化而设计的(尽管我仍然更喜欢GSON)。 不建议这样做,因为您正在创建潜在的运行时异常,可以避免该异常,包括缺少值和类型检查。

另外,如果不需要显式使用HashMap() ,则应使用mutableMapOf()而不是HashMap()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM