在扩展函数中传递带有参数的函数(kotlin)

pass function with parameters in extension function(kotlin)

扩展乐趣代码:

fun delayTask(millis: Long, myFunction: (data:String) -> Unit) {
    Handler().postDelayed({
        myFunction(data)    //why error is of data here
    }, millis)
}

这样调用:

 delayTask(500, ::function)

data 不是您的高阶函数的参数。它是您的函数参数的参数。所以你传递给传递的函数是不存在的

为了能够将此数据传递给您的 lambda,您需要将其添加为另一个参数:

fun delayTask(millis: Long, data: String, myFunction: (String) -> Unit) {
    Handler().postDelayed({
        myFunction(data)
    }, millis)
}

当你调用它时,你还必须传递数据:

delayTask(500, someDataString, ::function)

通过从函数参数中删除参数,您的函数可以更加通用。然后你可以通过将它包装在 lambda 中来调用具有任意数量参数的任何函数:

fun delayTask(millis: Long, myFunction: () -> Unit) {
    Handler().postDelayed({
        myFunction()
    }, millis)
}

delayTask(500) { myFunction(someData) }

出于性能原因,最好将其内联。但是传递的函数必须是 crossinline 因为它被包装在另一个对象中并稍后调用:

inline fun delayTask(millis: Long, crossinline myFunction: () -> Unit) {
    Handler().postDelayed({
        myFunction()
    }, millis)
}

请注意,Android Ktx core:

中的 postDelayed function 已提供此功能
Handler().postDelayed(500L) { someFunction() }