如何在 Kotlin 中使用 return 而不是 let ?

Hel*_*oCW 1 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) 此处不允许“返回”

错误:(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) }
    }
Run Code Online (Sandbox Code Playgroud)

代码 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)
    }
Run Code Online (Sandbox Code Playgroud)

小智 6

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

dataMapper.convertToDomain(city!!)
Run Code Online (Sandbox Code Playgroud)

此外,如果您想从 lambda返回,则必须使用限定返回:

return@use dataMapper.convertToDomain(city!!)
Run Code Online (Sandbox Code Playgroud)