【问题标题】:How can I use return instead of let in Kotlin?如何在 Kotlin 中使用 return 而不是 let?
【发布时间】:2017-11-05 08:05:21
【问题描述】:

代码 A 来自https://github.com/antoniolg/Kotlin-for-Android-Developers/blob/master/app/src/main/java/com/antonioleiva/weatherapp/data/db/ForecastDb.kt

我希望用return而不是let,所以我写了Code B,但是Code B不能编译,出现两个错误,为什么?

错误:(30, 10) 'return' is not allowed here

Error:(30, 45) 类型不匹配:推断类型是 CityForecast?但预计会有 CityForecast

代码 A

 override fun requestForecastByZipCode(zipCode: Long, date: Long) = forecastDbHelper.use {

        val dailyRequest = "${DayForecastTable.CITY_ID} = ? AND ${DayForecastTable.DATE} >= ?"
        val dailyForecast = select(DayForecastTable.NAME)
                .whereSimple(dailyRequest, zipCode.toString(), date.toString())
                .parseList { DayForecast(HashMap(it)) }

        val city = select(CityForecastTable.NAME)
                .whereSimple("${CityForecastTable.ID} = ?", zipCode.toString())
                .parseOpt { CityForecast(HashMap(it), dailyForecast) }

        city?.let { dataMapper.convertToDomain(it) }
    }

守则 B

 override fun requestForecastByZipCode(zipCode: Long, date: Long) = forecastDbHelper.use {

        val dailyRequest = "${DayForecastTable.CITY_ID} = ? AND ${DayForecastTable.DATE} >= ?"
        val dailyForecast = select(DayForecastTable.NAME)
                .whereSimple(dailyRequest, zipCode.toString(), date.toString())
                .parseList { DayForecast(HashMap(it)) }

        val city = select(CityForecastTable.NAME)
                .whereSimple("${CityForecastTable.ID} = ?", zipCode.toString())
                .parseOpt { CityForecast(HashMap(it), dailyForecast) }

        return  dataMapper.convertToDomain(city)
    }

【问题讨论】:

  • 您可能无法从关闭中返回。闭包的最后一个表达式是隐式返回的值。

标签: kotlin


【解决方案1】:

convertToDomain 期待一个非空的 CityForecast 而不是可空的 CityForecast?。因此,使用let 是一种更好的方法。否则,您必须像这样强制解开可空的 city

dataMapper.convertToDomain(city!!)

此外,如果您想从 lambda 返回,则必须使用 qualified returns

return@use dataMapper.convertToDomain(city!!)

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 2020-08-09
    • 1970-01-01
    • 2020-09-18
    • 2015-08-14
    • 2019-06-21
    • 2023-03-26
    • 2018-01-06
    • 2013-06-20
    相关资源
    最近更新 更多