缥帙各舒散,前后互相逾。这篇文章主要讲述Kotlin范围函数:Android EditText支持* apply *,* let *和* run *但不支持* with *相关的知识,希望能为你提供帮助。
我有一个包含EditText的Activity。进口途径:
import kotlinx.android.synthetic.main.myActivity.*
我想使用
with
函数但由于某种原因只能访问其他作用域函数:文章图片
显示
apply
,also
,run
,runCatching
,takeIf
和takeUnless
,但不是with
(是的,我向下滚动甚至打出来。如果我这样做,它标记为未知)。为了澄清,这里实际发生了什么:
文章图片
对象何时具有这些功能以及何时不具有规则?
答案这是因为当
apply
具有2个参数时,also
,run
,runCatching
,takeIf
,takeUnless
和with
是扩展。 Here是关于此的好文章。你可以像这样使用
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
}
另一答案您没有得到任何有关函数的建议,因为它没有源类型作为扩展名,而其他扩展包含附加到它的源。怎么样?
看看下面的区别:
【Kotlin范围函数(Android EditText支持* apply *,* let *和* run *但不支持* with *)】有功能
@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
是扩展的源类型。推荐阅读
- 使用twitter4j库的Twitter Android登录错误
- 使用contentResolver将docx转换为Base64会在Android上提供不可读的格式
- Koin如何注入Android活动/ appcompatactivity之外
- 在Mapbox Android中回调locationChanged
- 如何在kotlin android中将pdf文件编码为base64字符串
- 从Kotlin构造函数android中的Parcelable读取List列表
- 如何将加载覆盖进度条覆盖到android的“底部导航视图”(使用约束布局)
- 在浏览器中打开URL,从android上的shell脚本
- 使用adb命令测量Android应用的启动时间