Функции видимости Kotlin: Android EditText поддерживает * apply *, * let * и * run *, но не * with * - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть Activity, которая содержит EditText. Импортировано через:

import kotlinx.android.synthetic.main.myActivity.*

Я хотел бы использовать функцию with, но по какой-то причине доступна только другая функция определения объема:

apply, also, run, runCatching, takeIf and takeUnless are shown, but not with

apply, also, run, runCatching, takeIf и takeUnless показаны, но не with (и да, я прокрутил дальше вниз и даже набрал его. как неизвестно, если я сделаю это).

Чтобы уточнить, вот что на самом деле происходит:

Unresolved reference: with

Существуют ли правила, когда у объекта есть эти функции, а когда нет?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

Вы не получаете никаких предложений о с функцией , потому что у него нет типа источника в качестве расширения, в то время как другие расширения содержат источник, присоединенный к нему. Как?

Посмотрите на разницу ниже:

с функцией

@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    ...
    return receiver.block()
}

пусть функция

@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
    ...
    return block(this)
}

Здесь T - тип источника для расширения.

2 голосов
/ 16 апреля 2019

Это потому, что apply, also, run, runCatching, takeIf и takeUnless являются расширениями, когда with является функцией с 2 ​​параметрами. Здесь хорошая статья об этом.

Вы можете использовать with следующим образом:

with(editText) {
    //your code
}

Но вы не можете позвонить with, как вы пыталисьсделать это:

editText.with() //compilation error

Обновление : with Функция предназначена для более простого вызова методов объекта, вам не нужно писать что-то вроде этого:

someObject.a();
someObject.b();
someObject.c();
//etc

Когда вы используете with, вы можете написать это так:

with(someObject) {
    a();
    b();
    c();
    //etc
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...