【发布时间】:2019-11-05 02:31:29
【问题描述】:
在代码 A1 中我使用了let 语句,所以我认为filenameofVideo.path 不会为空
但我得到以下错误,为什么?
智能转换为“文件”是不可能的,因为“filenameofVideo”是一个可变属性,此时本可以更改
此时,我必须使用 Code A2。
代码 A1
private var filenameofVideo :File?=null
filenameofVideo?.let {
Navigation.findNavController(requireActivity(), R.id.fragment_container)
.navigate(UIFragmentCameraDirections.actionCameraToVideo(filenameofVideo.path))
}
代码 A2
private var filenameofVideo :File?=null
filenameofVideo?.let {filenameofVideo ->
Navigation.findNavController(requireActivity(), R.id.fragment_container)
.navigate(UIFragmentCameraDirections.actionCameraToVideo(filenameofVideo.path))
}
此外,我发现代码 B1 和代码 B2 都是正确的。为什么代码 B1 正确,代码 A1 错误?
代码 B1
private val aa:String?=null
aa?.let {
print(aa)
}
代码 B2
private val aa:String?=null
aa?.let{aa->
print(aa)
}
添加内容:
1:在代码 C 中,在 ?.let 调用中访问 var aa 和在 let 块中访问它之间,var aa 可能已被更改(可能被另一个线程更改)。
aa不为null时会启动codec,aaa为null时不会启动codec吧?
2:在代码D中(我假设编译器接受它),无论aa是否为null,函数总是被启动,它不能被接受,所以系统会中断,对吗?
代码 C
private var aa: String? = null
aa?.let { kk ->
print(kk.length)
}
代码 D
private var aa: String? = null
aa?.let {
print(aa.length)
}
【问题讨论】:
-
谢谢!但是代码A使用了安全调用
let -
但是您再次使用该属性而不是“它”。
-
谢谢!但是你不能使用
it,因为它是nest lamabad 表达式 -
简单地命名参数而不是使用
it。