让您拥有一些变量和apply
,run
,let
,also
,takeIf
或with
函数:
// private lateinit var someAdapter: SomeAdapter
recycler_view.apply {
this.layoutManager = LinearLayoutManager(context)
if (this::someAdapter.isInitialized) { // Compilation error.
this.adapter = someAdapter
}
}
如何访问someAdapter
的值或状态?
答案 0 :(得分:3)
您可以通过this@YourClass.adapter
访问它。这叫做合格,您可以查看文档here
答案 1 :(得分:2)
不是直接的答案,而是设计意见:当您保证在使用前设置lateinit var
时,应该使用它们。
isInitialized
甚至在Kotlin 1.2之前都不存在,只是作为错误回退而添加(前面的意见)。
如果您得到notInitializedException
很好的指示,则说明您没有正确初始化该字段,如果稍后再显式初始化它,则应改用可空字段:SomeAdapter?
。
答案 2 :(得分:2)
您可以使用以下之一。
recycler_view.apply {
this.layoutManager = LinearLayoutManager(context)
if (this@OuterClass::someAdapter.isInitialized) { //qualified
this.adapter = someAdapter
}
}
或
recycler_view.apply {
this.layoutManager = LinearLayoutManager(context)
if (::someAdapter.isInitialized) { // qualified works for immediate outer scope
this.adapter = someAdapter
}
}
答案 3 :(得分:1)
可以通过this
访问外部this@OuterClass
。但是,如果您没有其他someAdapter
,也可以省略this@YourOuterClass
并使用以下命令代替
if (::someAdapter.isInitialized) {
因此,鉴于以下情况,很明显someVar
中的Outer
是指:
class Outer<T> where T : Any {
lateinit var someVar : T
inner class Inner {
fun isItInitialized() = ::someVar.isInitialized
}
}
但是请注意以下几点:
class Outer<T> where T : Any {
lateinit var someVar : T
inner class Inner {
lateinit var someVar : T
fun isItInitialized() = ::someVar.isInitialized // now someVar of Inner is used
}
}
如果要访问外部的this@Outer::someVar.isInitialized
,则需要指定someVar
。