为 kotlin 扩展函数的基础对象附加上下文

Attach context for base object of kotlin extension function

此问题针对 Android 开发中使用的 Kotlin 扩展功能。

因此 Kotlin 为我们提供了将某些扩展行为添加到 class 中以扩展基于 class 行为的能力。

示例:(取自我当前的 Android 项目,用于使用 Espresso 测试时的 viewAssertion)

fun Int.viewInteraction(): ViewInteraction {
    return onView(CoreMatchers.allOf(ViewMatchers.withId(this), ViewMatchers.isDisplayed()))
}

在我的用例中,我可以像这样使用它:

R.id.password_text.viewInteraction().perform(typeText(PASSWORD_PLAIN_TEXT), pressDone())

一切都很好,除了这个扩展函数将扩展行为赋予所有 Int 对象,而不仅仅是 Android 中的视图 ID,这一点都不好。

问题是是否有任何方法可以为这个 Int 提供上下文,就像在 Android 中我们有 @IdRes in Android support annotation 上面给定的情况?

您无法区分来自资源的 Int 和普通 Int。它是相同的 class 并且您正在为 Int 类型的所有 class 添加一个扩展。

另一种方法是创建您自己的 Int 包装器:

class IntResource(val resource: Int) {

    fun viewInteraction(): ViewInteraction {
        return onView(CoreMatchers.allOf(ViewMatchers.withId(resource), ViewMatchers.isDisplayed()))
    }
}

然后我们像这样:

IntResource(R.id.password_text).viewInteraction().perform(typeText(PASSWORD_PLAIN_TEXT), pressDone())