我怎样才能使用回报,而不是让Kotlin?
代码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'在这里是不允许的
错误:(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) }
convertToDomain
期望一个非空的CityForecast
而不是可空的CityForecast?
。 所以,使用let
是一个更好的方法。 否则,你必须强行打开这样的可空city
:
dataMapper.convertToDomain(city!!)
除此之外,如果要从lambda 返回,则必须使用合格的返回值 :
return@use dataMapper.convertToDomain(city!!)