Kotlin returns 对象在 apply 函数中分配后具有未分配的属性
Kotlin returns object with unassigned properties after assigning them in apply function
我正在尝试执行一项非常简单的任务:将属性分配给一个对象,并在使用 REST 调用检索信息后 return 为同一对象分配属性。
在我的 runBlocking 块中,我使用 apply 函数来更改我的对象的属性,但是在尝试了不同的方法来分配它们、实例化对象本身、修改对象的构造逻辑之后,我仍然得到一个对象默认值。
这是我的信息对象:
class DrivingLicenceInfo {
var type : String = ""
var nationality : String = ""
var number : String = ""
var releaseDate : String = ""
var expiryDate : String = ""
}
这是给我带来问题的方法:
private fun getDerivingLicenceInfoAndWaitForCompletion(): DrivingLicenceInfo {
return runBlocking {
val response = retrieveDrivingLicenceInfoAsync().await()
if (response.isSuccessful) {
var info = DrivingLicenceInfo()
response.body()?.let {
info.apply {
it.data.let { data ->
val type = data.guy
val drivingLicenseNationality = data.drivingLicenseNationality
val drivingLicenseNumber = data.drivingLicenseNumber
val drivingReleaseDate = data.drivingReleaseDate
val drivingExpiryDate = data.drivingExpiryDate
this.type = type
this.nationality = drivingLicenseNationality
this.number = drivingLicenseNumber
this.releaseDate = drivingReleaseDate
this.expiryDate = drivingExpiryDate
}
}
info
Log.i("driving.info.call", info.type)
}
}
DrivingLicenceInfo()
}
}
这里是我在 Main 中使用它的地方,也是我获得一个带有空字符串作为属性的信息对象的地方
private void getDrivingLicenceData() {
DrivingLicenceInfoService service = new DrivingLicenceInfoServiceImpl(context);
DrivingLicenceInfo info = service.getDrivingLicenceInfo();
Log.i("driving.info.main",info.getType());
profileViewModel.licenceNumber.postValue(info.getNumber());
profileViewModel.licenceExpiryDate.postValue(info.getExpiryDate());
}
runBlocking 中的日志正确显示 属性,我的 Main 中的日志甚至没有显示。
使用调试器,我能够看到该信息具有空字符串作为值。
有人可以帮我弄清楚我做错了什么吗?
谢谢
除了@JeelVankhede 给出问题的主要原因外,我还建议对代码进行一些小的改进。我个人觉得这样更简洁,可读性更好
private fun getDrivingLicenceInfoAndWaitForCompletion(): DrivingLicenceInfo {
return runBlocking {
val response = retrieveDrivingLicenceInfoAsync().await()
var info = DrivingLicenceInfo()
return if (response.isSuccessful) {
response.body()?.let {
info.apply {
type = it.data.guy
nationality = it.data.drivingLicenseNationality
number = it.data.drivingLicenseNumber
releaseDate = it.data.drivingReleaseDate
expiryDate = it.data.drivingExpiryDate
}
Log.i("driving.info.call", info.type)
info
} ?: info
} else { info }
}
}
因为@JeelVankhede 已经告诉你问题的主要原因,除了@WarrenFaith 给出的建议,我还有一些建议。
如果 DrivingLicenceInfo
是一个模型 class 你可以像
一样将它声明为 data class
data class DrivingLicenceInfo (
val type : String = "",
val nationality : String = "",
val number : String = "",
val releaseDate : String = "",
val expiryDate : String = ""
)
您可以阅读有关数据的更多信息 class here。
然后你可以把你的函数写成
private fun getDerivingLicenceInfoAndWaitForCompletion(): DrivingLicenceInfo {
val info = runBlocking {
val response = retrieveDrivingLicenceInfoAsync().await()
if (response.isSuccessful) {
response.body()?.let {
it.data.let { data ->
DrivingLicenceInfo(
type = data.guy,
nationality = data.drivingLicenseNationality,
number = data.drivingLicenseNumber,
releaseDate = data.drivingReleaseDate,
expiryDate = data.drivingExpiryDate
)
}
} ?: DrivingLicenceInfo()
} else {
DrivingLicenceInfo()
}
}
Log.i("driving.info.call", info.type)
return info
}
我正在尝试执行一项非常简单的任务:将属性分配给一个对象,并在使用 REST 调用检索信息后 return 为同一对象分配属性。
在我的 runBlocking 块中,我使用 apply 函数来更改我的对象的属性,但是在尝试了不同的方法来分配它们、实例化对象本身、修改对象的构造逻辑之后,我仍然得到一个对象默认值。
这是我的信息对象:
class DrivingLicenceInfo {
var type : String = ""
var nationality : String = ""
var number : String = ""
var releaseDate : String = ""
var expiryDate : String = ""
}
这是给我带来问题的方法:
private fun getDerivingLicenceInfoAndWaitForCompletion(): DrivingLicenceInfo {
return runBlocking {
val response = retrieveDrivingLicenceInfoAsync().await()
if (response.isSuccessful) {
var info = DrivingLicenceInfo()
response.body()?.let {
info.apply {
it.data.let { data ->
val type = data.guy
val drivingLicenseNationality = data.drivingLicenseNationality
val drivingLicenseNumber = data.drivingLicenseNumber
val drivingReleaseDate = data.drivingReleaseDate
val drivingExpiryDate = data.drivingExpiryDate
this.type = type
this.nationality = drivingLicenseNationality
this.number = drivingLicenseNumber
this.releaseDate = drivingReleaseDate
this.expiryDate = drivingExpiryDate
}
}
info
Log.i("driving.info.call", info.type)
}
}
DrivingLicenceInfo()
}
}
这里是我在 Main 中使用它的地方,也是我获得一个带有空字符串作为属性的信息对象的地方
private void getDrivingLicenceData() {
DrivingLicenceInfoService service = new DrivingLicenceInfoServiceImpl(context);
DrivingLicenceInfo info = service.getDrivingLicenceInfo();
Log.i("driving.info.main",info.getType());
profileViewModel.licenceNumber.postValue(info.getNumber());
profileViewModel.licenceExpiryDate.postValue(info.getExpiryDate());
}
runBlocking 中的日志正确显示 属性,我的 Main 中的日志甚至没有显示。 使用调试器,我能够看到该信息具有空字符串作为值。
有人可以帮我弄清楚我做错了什么吗?
谢谢
除了@JeelVankhede 给出问题的主要原因外,我还建议对代码进行一些小的改进。我个人觉得这样更简洁,可读性更好
private fun getDrivingLicenceInfoAndWaitForCompletion(): DrivingLicenceInfo {
return runBlocking {
val response = retrieveDrivingLicenceInfoAsync().await()
var info = DrivingLicenceInfo()
return if (response.isSuccessful) {
response.body()?.let {
info.apply {
type = it.data.guy
nationality = it.data.drivingLicenseNationality
number = it.data.drivingLicenseNumber
releaseDate = it.data.drivingReleaseDate
expiryDate = it.data.drivingExpiryDate
}
Log.i("driving.info.call", info.type)
info
} ?: info
} else { info }
}
}
因为@JeelVankhede 已经告诉你问题的主要原因,除了@WarrenFaith 给出的建议,我还有一些建议。
如果 DrivingLicenceInfo
是一个模型 class 你可以像
data class
data class DrivingLicenceInfo (
val type : String = "",
val nationality : String = "",
val number : String = "",
val releaseDate : String = "",
val expiryDate : String = ""
)
您可以阅读有关数据的更多信息 class here。
然后你可以把你的函数写成
private fun getDerivingLicenceInfoAndWaitForCompletion(): DrivingLicenceInfo {
val info = runBlocking {
val response = retrieveDrivingLicenceInfoAsync().await()
if (response.isSuccessful) {
response.body()?.let {
it.data.let { data ->
DrivingLicenceInfo(
type = data.guy,
nationality = data.drivingLicenseNationality,
number = data.drivingLicenseNumber,
releaseDate = data.drivingReleaseDate,
expiryDate = data.drivingExpiryDate
)
}
} ?: DrivingLicenceInfo()
} else {
DrivingLicenceInfo()
}
}
Log.i("driving.info.call", info.type)
return info
}