Проблема с инфиксом Android

У меня интересная проблема. Когда я отлаживаю свое приложение isResColorId является false, К несчастью, let функция срабатывает, и я вижу qwe на logcat.

fun drawableTint(context: Context, view: View, colorID: Int, isResColorId: Boolean = true) {
    try {
        val wrap = DrawableCompat.wrap(view.background)
        DrawableCompat.setTint(wrap, isResColorId then let { Timber.d("qwe"); ContextCompat.getColor(context, colorID) } ?: colorID)
        view.setBackgroundDrawable(wrap)
    }catch (e: Resources.NotFoundException){
        Timber.e(e, "c_id: $colorID coz: $isResColorId")
    }
}

infix fun <T> Boolean.then(param: T): T? = if (this) param else null

Logcat:

qwe

2 ответа

Решение

Чтобы быть уверенным в том, что происходит, вы должны напечатать it внутри лямбды. Но, вероятно, происходит следующее:

isResColorId.then(this.let({...})) ?: colorId

Это означает, что блок внутри let всегда оценивается.

Если вы не хотите оценивать второй аргумент инфиксной функции, если первый аргумент имеет значение false, вы должны передавать лямбда, а не значение:

inline infix fun <T> Boolean.then(block: () -> T): T? = if (this) block() else null

Но в этом случае я бы лучше написал if (condition) A else B напрямую, а не возвращать пустое значение, которое вводит бокс и заставляет вас проверять наличие null потом с помощью оператора elvis.

Другие вопросы по тегам