为 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())
此问题针对 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())