首页 > 解决方案 > 在扩展函数(kotlin)中传递带参数的函数

问题描述

扩展趣味代码:

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

像这样调用:

 delayTask(500, ::function)

标签: androidkotlinkotlin-extension

解决方案


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)
}

请注意,此功能已postDelayed Android Ktx 中提供core

Handler().postDelayed(500L) { someFunction() }

推荐阅读