问题标签 [kotlin-extension]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1921 浏览

boolean - 布尔扩展函数

当我尝试创建扩展函数来设置布尔值 true 或 false 时,如下所示。

它说变量 expected。如何实现这一点。

0 投票
2 回答
593 浏览

kotlin - 如何在类文件中放置 Kotlin 扩展?

也许官方文档中回答了这个问题,但我没有看到它......

在 Swift 中,我们习惯于编写类似的东西

并将整个代码片段放在一个文件中,比如Jazz.swift.

我们在 Kotlin 中似乎无法做相应的事情?我总是发现我的 selfe 写作,例如 oneJazz.kt和 one JazzExtensions.kt,这并不总是构建代码的最清晰的方式。

对此的任何意见表示赞赏。

0 投票
2 回答
1285 浏览

android - 如何创建 Kotlin DSL - DSL 语法 Kotlin

anko 一样,您可以编写如下回调函数:

如何创建这样的嵌套函数?我尝试像下面这样创建它,但似乎没有用。

现在,如果我将它与扩展功能一起使用,

从活动中调用它:

不工作。我在这里仍然缺乏一些基本概念。有人可以在这里指导吗?

0 投票
1 回答
3118 浏览

kotlin - Kotlin 内联扩展属性

我知道inline关键字意味着避免调用函数的调用开销。但我不知道内联扩展属性的作用是什么?

假设我们有两个名为foo的扩展属性和另一个名为bar的内联属性

执行它们中的任何一个,我们都会得到预期的输出,即当前时间。

该文件的字节码如下:

我们可以看到两者相似但仅在以下几行上有所不同:

foo提取物:

酒吧提取物:

我真的不明白这里发生了什么。有人可以指出我的行为是什么,或者java中的等价物,或者对此有什么用处?

编辑

鉴于编译器将替换内联属性的内容,是否可以方便地内联每个没有繁重操作的扩展属性?

谢谢

0 投票
2 回答
217 浏览

android - 检查我的 Activity 是否处于 MultiWindowMode 或不使用 Kotlin

如何检查我的活动是否处于MultiWindowMode中。

我用过Myactivity.isInMultiWindowMode()and MYactivity.isInPictureInPictureMode(),但显示错误

我是否必须扩展MultiWindow无法识别的内容

我已经阅读了有关多窗口的其他帖子,但没有希望

0 投票
1 回答
648 浏览

scala - Kotlin 的扩展函数是如何工作的?

假设我想要一个提供square方法的整数。

科特林

用法:

文档:

扩展实际上并不修改它们扩展的类。通过定义扩展,您不会将新成员插入到类中,而只是使新函数可以使用这种类型的变量的点符号调用。

我们想强调的是扩展函数是静态调度的

我的期望是他们只是在编译期间将它添加到扩展类的成员函数中,但这是他们明确否认的,所以我的下一个想法是它可能“有点”像 scala 隐式。

斯卡拉

用法:

进而

文档:

隐式类被分解为类和隐式方法配对,其中隐式方法模仿类的构造函数。

生成的隐式方法将与隐式类具有相同的名称。

但是 scala 隐式创建了一个新类,这将禁用this.

那么...... Kotlin 是如何扩展类的呢?“使可调用”并没有告诉我太多。

0 投票
1 回答
180 浏览

android - 扩展函数未创建新的 Observable 对象

我对 kotlin 和 rxjava 有意外行为。我创建了一个使用毕加索加载图像的扩展函数

我像这样在很近的时间间隔内(几乎同时)多次调用它,

我希望每次loadBitmap都会被调用,它会创建一个新的 observable。但我在日志中得到了这个

loadBitmap所有调用的 observable 都是相同的。我需要他们有自己的 observable,因为如果我不这样做,当retryWhen失败时,它不会继续下一次失败。我希望它有意义。

将 observable 放入 adeferflatmap不会改变任何东西。

编辑我的代码

我使用 MVP,只是为了让您看到更广泛的内容。所以,这是一个视图中的函数,渲染将在模型完成从服务器获取数据后触发。

0 投票
6 回答
2245 浏览

kotlin - Kotlin 成员和扩展同时进行

为了更多地了解 Kotlin 并尝试使用它,我正在开发一个示例 Android 应用程序,我可以在其中尝试不同的东西。

但是,即使在该主题上搜索了一段时间后,我也无法找到以下问题的正确答案:

让我们在 View 类上声明一个(虚拟)扩展函数:

现在我如何从其他地方引用这个函数以便稍后调用它?

目前给我:

错误:(57, 35) 类型不匹配:推断类型为 KFunction2 但 (Int) -> Boolean 是预期错误:(57, 41) 'isViewVisibility' 同时是成员和扩展。不允许引用此类元素

有什么解决方法吗?谢谢 !

0 投票
1 回答
1517 浏览

kotlin - 如何扩展 Kotlin Number 类或使用泛型创建一个简单的属性 getter,它将对所有 Number 子类进行操作?

我试图通过构建扩展内置类的非常简单的方法和属性获取器来了解有关 Kotlin 抽象类扩展和泛型的更多信息。我基本上是成功的,但我被 Number 类难住了。我的测试属性Number.sgn旨在返回 Number 的任何子类的符号(1 或 -1 作为 Int)。为简单起见,负数应该返回 -1,而正数和 0 应该返回 1。我对这个方法的用例不是特别感兴趣,但为了理解如何编写这样简单的东西——以及为什么我的代码会生成错误。我的模块中唯一的导入是kotlin.text.*,我收到的错误消息确实提到了那里的冲突。我只是不明白它为什么会发生冲突以及如何克服它——尽管我在猜测它

我首先编写了扩展 Int 类的代码,效果很好:

inline val Int.sgn get() = if (this<0) -1 else 1 // sign of number

然后我尝试概括并将其移至 Number 类,如下所示:

inline val Number.sgn get() = if (this<0) -1 else 1 // doesn't compile

编译错误如下:

unresolved reference. None of the following candidates is applicable because of receiver type mismatch: public fun String.compareTo(other: String, ignoreCase: Boolean = ...): Int defined in kotlin.text inline fun Number.sgn() = if (this<0) -1 else 1 ^

然后我尝试了一种不同的方法,使用泛型:

inline val <T:Number> T.sgn get() = if (this<0) -1 else 1

我从编译器收到了同样的错误:

error: unresolved reference. None of the following candidates is applicable because of receiver type mismatch: public fun String.compareTo(other: String, ignoreCase: Boolean = ...): Int defined in kotlin.text inline val <T:Number> T.sgn get() = if (this<0) -1 else 1 ^

谁能帮我理解为什么存在类型不匹配,以及为什么kotlin.text在这里很重要?有没有一种方法可以用来克服这个问题并让这个属性获取器应用于 Number 的所有子类?(再一次,我知道这不是一个有意义的用例,而是一个简化的示例,可以帮助我理解其背后的原理。)提前感谢任何人都可以提供的任何建议......

0 投票
2 回答
3513 浏览

kotlin - Kotlin 扩展方法作为长方法名称的别名?

我正在使用 Kotlin 原生库对象在 Kotlin 中工作,该对象包含一个方法,其.nameIsMuchTooLongAndIsStillNotClear. 以类似于 的方式typealias,我想为该方法创建一个别名,因此我可以将其称为 something .shortAndClear。为了使事情稍微复杂化,这些函数有几个参数,其中许多具有我不希望在包装器中预处理的默认值。经过进一步研究,似乎扩展功能仍然是要走的路。

要使用一个易于测试的示例函数,假设我想为其创建一个别名类型的扩展String.startsWith名为String.beg. 我可以轻松获得以下解决方案:

但是,这似乎要求我列出所有参数及其默认值,并且对每个重载都这样做。(有问题的真正方法签名要长得多,有更多的默认值。)本着“不要重复自己”的精神,有没有一种方法可以使用函数引用String::startsWith这样我就不必枚举所有参数? 我尝试了几种形式,但它们都不起作用: