如何检查本地val是否已初始化?

时间:2018-03-05 09:52:05

标签: android kotlin

我有以下单位功能:

private fun loadFilterArea() {
    val query = ALIAS.AREA
    val type = preferences.getInt(query, TYPEVALUES.MY_LOCATION)

    val longitude: Double
    val latitude: Double

    when (type) {
        TYPEVALUES.MY_LOCATION -> {
            ...
            longitude = point.longitude
            latitude = point.latitude
            ...
        }
        TYPEVALUES.CUSTOM_RADIUS -> {
            ...
            longitude = point.longitude
            latitude = point.latitude
            ...
        }
        TYPEVALUES.INPUT -> {
            ...
            longitude = preferences.getFloat(ALIAS.AREA_LONGITUDE, 0f).toDouble()
            latitude =  preferences.getFloat(ALIAS.AREA_LATITUDE, 0f) .toDouble()
            ...
        } else -> {
            ...
        }
    }

    //... the question is here ...
    //... can't be compiled cause val's are not initialized
    if (longitude != null && latitude != null) {
        storeKey(ALIAS.AREA_LONGITUDE, longitude)
        storeKey(ALIAS.AREA_LATITUDE, latitude)
    } 
  }

那么,如何检查经度和纬度值是否已初始化?

我不想将它们从函数移动到全局范围,并使用它们作为lateinit进一步使用:: latitude.isInitialized,看起来我的Kotlin版本不支持本地lateinit变量

2 个答案:

答案 0 :(得分:3)

如果为您的用例提供纬度和经度的null值是有意义的,那么您可以将这些变量定义为可空Double,例如var latitude: Double? = nulllongitude相同{1}})。在那之后,检查它们是否不是null是有意义的,但变量不再是不可变的。 为了保持不变性,你可以做类似的事情:

val longitude: Double?
val latitude: Double?

when (type) {
    TYPEVALUES.MY_LOCATION -> {
        longitude = ...
        latitude = ...
        ...
    }

    TYPEVALUES.CUSTOM_RADIUS -> {
        longitude = ...
        latitude = ...
        ...
    }

    TYPEVALUES.INPUT -> {
        ...
    } else -> {
        latitude = null
        longitude = null
    }
}

否则,如果您希望它们不可为空,那么您需要在null语句的所有分支中提供有意义的非when值。

答案 1 :(得分:1)

您可以使用何时直接存储值的功能,以便声明和分配同时完成:

{{1}}