15

我正在考虑在一个文件中为 String 添加一个全局扩展方法,无论我在哪里使用 String,我都可以使用这个扩展。

但是我没有找到这样做的方法......我现在只是将扩展粘贴到任何地方。

在 A.kt 中的扩展:

class A{
    ......
    fun String.add1(): String {
        return this + "1"
    }
    ......
}

并在 B.kt 中像这样访问:

class B{
    fun main(){
        ......
        var a = ""
        a.add1()
        ......
    }
}

我已经尝试了所有我可以添加的东西staticfinal但没有任何效果。

4

2 回答 2

25

确保您的扩展函数是顶级函数,并且没有嵌套在类中 - 否则它将是成员扩展,只能在它所在的类中访问:

package pckg1

fun String.add1(): String {
    return this + "1"
}

然后,如果您在不同的包中使用它,则必须像这样导入它(IDE​​ 也应该建议这样做):

package pckg2

import pckg1.add1

fun x() {
    var a = ""
    a.add1()
}
于 2017-07-13T05:06:01.270 回答
12

您可以使用with-function 在定义它的类之外使用成员扩展。在传递给 的 lambda 内部withthis将引用A您传入的实例。这将允许您使用内部定义的扩展函数A。像这样:

val a =  A()
val s = "Some string"
val result = with(a) {
    s.add1()
}
println(result) // Prints "Some string1"
于 2017-07-13T10:16:17.833 回答