Доступ к методу расширения kotlin в другом КТ

Я думаю о добавлении глобального метода расширения к String только в одном файле, и везде, где я использую String, я всегда могу использовать это расширение.

Но мне не удалось найти способ сделать это... теперь я просто вставляю расширение везде.

расширение здесь в A.kt:

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

и получить доступ, как это в B.kt:

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

Я пробовал все, что мог добавить, например static и final, но ничего не получалось.


person Draculea    schedule 13.07.2017    source источник
comment
Эй, это должно сработать. Вы используете ИДЕЮ? Нет предложений по импорту?   -  person zsmb13    schedule 13.07.2017
comment
@ zsmb13 zsmb13 Я использую Android Studio с плагином kotlin версии 1.1.3-2, и нет предложений по импорту, говорится в нерешенной ссылке.   -  person Draculea    schedule 13.07.2017
comment
Можно ли использовать классы, объявленные в других файлах?   -  person zsmb13    schedule 13.07.2017
comment
@zsmb13 ага, я могу   -  person Draculea    schedule 13.07.2017
comment
У вас есть точное сообщение об ошибке? Это просто неразрешенная ссылка на имя расширения?   -  person zsmb13    schedule 13.07.2017
comment
Является ли функция расширения функцией верхнего уровня, и все ваши классы либо находятся в том же пакете, что и функция расширения, либо импортированы?   -  person Naetmul    schedule 13.07.2017
comment
@zsmb13 zsmb13 да, я имею в виду, что я просто добавил расширение fun в файл kt и попытался получить доступ к b.add1() в другом файле kt   -  person Draculea    schedule 13.07.2017
comment
@ zsmb13 zsmb13, ну, не в одном пакете, и два файла kt не имеют отношения   -  person Draculea    schedule 13.07.2017
comment
Можете ли вы сказать нам, что именно говорит ошибка, которую вы получаете?   -  person zsmb13    schedule 13.07.2017
comment
Что ж, если они находятся в другом пакете, возможно, вам придется импортировать функцию расширения, но я в этом не уверен.   -  person Naetmul    schedule 13.07.2017
comment
@zsmb13 zsmb13 ну, я снова не смог импортировать расширение [слезы]   -  person Draculea    schedule 13.07.2017
comment
Теперь, когда вы обновили код в своем посте, я понял это, см. мой ответ ниже.   -  person zsmb13    schedule 13.07.2017


Ответы (2)


Убедитесь, что ваша функция расширения является функцией верхнего уровня, а не вложенный в класс - в противном случае это будет расширение члена, который доступен только внутри класса, в котором он находится:

package pckg1

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

Затем, если вы используете его в другом пакете, вы должны импортировать его следующим образом (это также должно быть предложено IDE):

package pckg2

import pckg1.add1

fun x() {
    var a = ""
    a.add1()
}
person zsmb13    schedule 13.07.2017
comment
Я написал расширение внутри класса! Вот почему я потерпел неудачу! - person Draculea; 13.07.2017
comment
то же самое здесь, внутри класса :) - person noloman; 21.11.2017

Вы можете использовать функцию with, чтобы использовать расширение члена вне класса, в котором оно было определено. Внутри лямбды, переданной в with, this будет ссылаться на экземпляр A, который вы передаете. Это позволит вам использовать функции расширения, определенные внутри A. Как это:

val a =  A()
val s = "Some string"
val result = with(a) {
    s.add1()
}
println(result) // Prints "Some string1"
person marstran    schedule 13.07.2017