kotlin - 嵌套安全调用 Null 检查 Kotlin
问题描述
我需要在 ImageView 中显示图像,所以我需要先确保图像 url 不为空。这3个选项有效吗?
答案数据类
data class Answer(
val id: Long?,
val title: String?,
val answerImage: AnswerImage?
) {
data class AnswerImage(
val x0: AnswerImageData?,
val x1: AnswerImageData?,
val x2: AnswerImageData?
) {
data class AnswerImageData(
val id: String?,
val url: String?
)
}
}
选项1
answer.answerImage?.let { answerImage ->
answerImage.x0?.let { answerImageData ->
answerImageData.url?.let {
//display image
}
}
}
选项 2
if (answer.answerImage?.x0?.url != null)
{
//display image
}
选项 3
answer.answerImage?.x0?.url?.let {
//display image
}
解决方案
简短的回答:是的。
选项 1:仅当您确实需要用它做更多事情而不是安全地施放它时,这才是一个不错的
answerImage
选择answerImageData
。在这种特定情况下,我们没有必要明确声明这些变量。总结:在这种情况下,选项 1 不是一个非常简洁的解决方案,但它确实有效。选项 2:应该有效,因为所有属性都是不可变的。然后编译器可以在下一行(在
if
范围内)推断出该url
属性仍然是 non-null
。选项 3:在我看来这是最好的一个:作为代码阅读器,这是最容易处理的,因为您通常会使用如下代码完成它:
.let { safeUrl -> .. }
.
推荐阅读
- python - 如何将类的实例分配为类主体中同一类的属性?
- wordpress - 如何在提交按钮下方放置“接受”?Elementor Pro Form + 内联输入问题
- javascript - Promises JS:函数响应不返回到主代码
- c++ - 关于`std::unique_prt
& pBase= make_unique ();` - swift - SwiftUI - 将表单的结果保存到 JSON
- list - 从 Caml.List 函数转换为基本模块
- java - 不使用 Pane.getChildren().removeAll() 有没有更快的绘制方法?
- sql-server - 有没有办法从应用程序端找出实体框架和用于 SQL Server 的 .NET 数据提供程序的 sql 查询超时?
- android - 如何在多个 iOS 模拟器中运行 Flutter
- date - 用户正在获取字符串长度小于 0 或不是整数。详细信息:BI 启动板中的 errorKind 其他用户可以运行报告