Как получить доступ к variable.isInitialized из `apply` в Kotlin? - PullRequest
0 голосов
/ 18 сентября 2018

Пусть у вас есть некоторая переменная и 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?

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

Доступ к внешнему 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.

0 голосов
/ 18 сентября 2018

Не прямой ответ, а скорее мнение дизайнера: lateinit var предполагается использовать, когда вы гарантированно настроите их перед использованием.

isInitialized даже не присутствовал до Kotlin 1.2, он был добавлен (мнение впереди) как откат ошибки.

Если вы получаете notInitializedException, это хороший показатель, что выНеправильная инициализация поля, если вы позже явно инициализируете его, вам следует вместо этого использовать пустое поле: SomeAdapter?.

0 голосов
/ 18 сентября 2018

Вы можете использовать один из следующих вариантов.

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
    }
}
0 голосов
/ 18 сентября 2018

Вы можете получить к нему доступ через this@YourClass.adapter.Это называется квалифицированным, вы можете посмотреть документацию здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...