如何从Kotlin中的'apply'访问variable.i初始化?

如何从Kotlin中的'apply'访问variable.i初始化?,kotlin,Kotlin,让您有一些变量和应用,运行,让,也,使用功能: // private lateinit var someAdapter: SomeAdapter recycler_view.apply { this.layoutManager = LinearLayoutManager(context) if (this::someAdapter.isInitialized) { // Compilation error. this.adapter = someAdapter

让您有一些变量和
应用
运行
使用功能:

// private lateinit var someAdapter: SomeAdapter

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

如何访问
someAdapter的值或状态?

您可以通过
this@YourClass.adapter
。这被称为限定,您可以查看文档

不是直接回答,而是设计意见:
lateinit var
s应该在您保证在使用前设置好的情况下使用

i初始化
在Kotlin 1.2之前甚至不存在,它只是作为错误回退添加的(意见提前)


如果您得到的是
notInitializedException
这是一个很好的指标,说明您没有正确初始化字段,如果您以后显式初始化它,那么您应该改用null字段:
SomeAdapter?
您可以使用以下选项之一

recycler_view.apply {
    this.layoutManager = LinearLayoutManager(context)
    if (this@OuterClass::someAdapter.isInitialized) { //qualified
        this.adapter = someAdapter
    }
}


通过
this@OuterClass
。但是,如果没有任何其他
someAdapter
,也可以省略
this@YourOuterClass
,只需使用以下选项即可:

if (::someAdapter.isInitialized) {
因此,鉴于以下情况,很明显,
Outer
someVar
是指:

class Outer<T> where T : Any {
  lateinit var someVar : T
  inner class Inner {
    fun isItInitialized() = ::someVar.isInitialized
  }
}
类外部,其中T:Any{
lateinit变量someVar:T
内部类内部类{
乐趣isInitialized()=::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
  }
}
类外部,其中T:Any{
lateinit变量someVar:T
内部类内部类{
lateinit变量someVar:T
fun isItInitialized()=::someVar.isInitialized//现在使用内部的someVar
}
}

您需要指定
this@Outer::someVar.isInitialized
如果你想访问外部
someVar

你能引用
someAdapter
而不在它前面加上
this
?@MFazio23,是的,但是
isInitialized
无法解析。你能显示外部类代码吗谢谢,但现在我无法获取状态:
this@SomeFragment.someAdapter.isInitialized
isInitialized
未解析)。我不知道
某个适配器
的外观如何,但该错误表示
isInitialized
不存在或是专用的。它是一个内联函数,请参阅。它检查
lateinit var
变量是否已经初始化。谢谢,在另一种情况下,当我从嵌套
run
访问视图时,它帮助了我。同意你的说法,这就是为什么我有时更喜欢
lateinit var
:它显示,当应用程序出现事件顺序问题时。Welcome@CoolMindI一定是瞎了。。。我没有在页面上看到
::someAdapter.isInitialized
。。。直到现在:-)但是我不认为你的评论是正确的。。。如果
someAdapter
将位于任何外部类中,只要不存在具有相同名称的任何其他成员,它仍然可以访问。然后它可能会捕捉到错误;-)是的,罗兰,我同意。我的意思是,它将解析为它在直接外部范围中找到的变量。但我明白你的观点,它实际上会引起混乱
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
  }
}