如何从Kotlin中的“ apply”访问variable.isInitialized?

时间:2018-09-18 12:32:58

标签: kotlin

让您拥有一些变量和applyrunletalsotakeIfwith函数:

// private lateinit var someAdapter: SomeAdapter

recycler_view.apply {
    this.layoutManager = LinearLayoutManager(context)
    if (this::someAdapter.isInitialized) { // Compilation error.
        this.adapter = someAdapter
    }
}

如何访问someAdapter的值或状态?

4 个答案:

答案 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