如何从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
}
}