Проблема с инфиксом 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.