Witam, jest jakaś możliwość przekazania funkcji do klasy?
w głownej klasie aktywności mam funkcje "wyswietlPosty()" i chcialbym ja przekazac do klasy która jest poza klasą głównej aktywności.
Witam, jest jakaś możliwość przekazania funkcji do klasy?
w głownej klasie aktywności mam funkcje "wyswietlPosty()" i chcialbym ja przekazac do klasy która jest poza klasą głównej aktywności.
Mógłbyś wrzucić kawałek kodu dla kontekstu? Masz problem z przekazaniem funkcji jakiejkolwiek np. z określeniem typu argumentu, jaki powinna przyjmować funkcja, do której chcesz przekazać np. wyswietlPosty, czy z sytuacją gdy funkcja jest metodą klasy?
Jeśli to drugie, to rozwiązanie jest całkiem proste:
val odwolanie = Foo::bar
Jeśli to pierwsze, to musisz określić co przekazywana jako argument funkcja będzie przyjmować i co zwracać jako typ np.
fun mojaFunkcja(arg: String, func: (String) -> Unit) {
func(arg)
}
Tutaj mojaFunkcja przyjmuje jako drugi argument funkcję przyjmującą String i nie zwracająca niczego (znaczy Unit)
Wywołać ją możesz zarówno dla funkcji statycznej (zdefiniowanej wewnątrz companion object) jak i metody klasy (wtedy musisz się do niej odwołać z instancji albo kombinować z typem KFunction, czego właściwie nie próbowałem, ale śmiało)
mojaFunkcja(jakisArgument, Foo::funkcjaZCompanionObject)
val foo = Foo()
mojaFunkcja(jakisArgument, foo::funkcjaJakoMetodaKlasy)
Funkcje możesz przekazywać tak samo jak każdy inny obiekt. Poniżej masz mały przykład.
class MojaKlasa(private val func1: (Int) -> Int) {
fun uzyjFunkcjiKonstruktoraNaWartosci(wartosc: Int) = func1(wartosc)
fun uzyjFunkcjiNaLiczbieDwa(func2: (Int) -> Int) = func2(2)
}
fun podzielPrzezDwa(wartosc: Int) = wartosc / 2
fun main() {
val pomnozPrzezDwa: (Int) -> Int = { it * 2 }
val klasa = MojaKlasa(pomnozPrzezDwa)
val a = klasa.uzyjFunkcjiKonstruktoraNaWartosci(4)
println(a)
val b = klasa.uzyjFunkcjiNaLiczbieDwa(pomnozPrzezDwa)
println(b)
val c = klasa.uzyjFunkcjiNaLiczbieDwa(::podzielPrzezDwa)
println(c)
}
Z kolei jeżeli chcesz przekazywać funkcję np. z jednej aktywności do drugiej, to będzie to bardzo problematyczne i na pewno nie jest to coś, co chciałbyś zrobić.