我创建了一个函数,如下所示:
fun someFunction( callBack: () -> Unit ){ callback.invoke() }
当我将使用函数:
someFunction( callBack = callBackFun() )
因此,问题是,由于我不知道callBackFun()将有多少个参数(可能是0个或多个),因为someFunction可以在多种情况下使用。我如何创建具有0个或多个参数的回调(vararg在这种情况下不起作用)
nhaq1z211#
将callBackFun()放在两个花括号{}中,就可以传递任何带有不同参数的函数:
callBackFun()
{}
someFunction( callBack = { callBackFun() } ) someFunction( callBack = { secondCallBackFun(arg1, arg2) } ) someFunction( callBack = { thirdCallBackFun(arg1, arg2, arg3) } )
你甚至可以传递多个函数,并在lambda中编写你想要的任何逻辑,就像其他函数一样:
someFunction( callBack = { val arg1 = "test" val arg2 = "test2" val arg3 = 21 callBackFun() secondCallBackFun(arg1, arg2) thirdCallBackFun(arg1, arg2, arg3) } )
但是callBack lambda函数的参数应该是已知的,你设置它的类型为:() -> Unit所以它不带任何参数。
() -> Unit
6ie5vjzr2#
目前不支持在回调函数中使用vararg,如果愿意,可以使用List:
vararg
List
fun someFunction( callBack: (args: List<Any>) -> Unit ){ callback.invoke(listOf<Any>()) }
hgtggwj03#
在Kotlin中你可以提供几个lambda函数到带有vararg的高阶函数,这没有问题。例如,像这样:
fun myFunction(vararg func: () -> Unit) { //Something to do }
您可以按如下方式使用它:
myFunction( { TODO() }, { TODO() }, { TODO() }, )
或者甚至是这样:
myFunction( func = arrayOf( { TODO() }, { TODO() }, { TODO() }, ) )
UPD:如果要按函数名提供(如下所示:newFun())您还可以考虑以下情况:
newFun()
myFunction( func = arrayOf( ::newFun, ::newFun2, ::newFun3, ) )
当然还有:
myFunction( ::newFun, ::newFun2, ::newFun3, )
3条答案
按热度按时间nhaq1z211#
将
callBackFun()
放在两个花括号{}
中,就可以传递任何带有不同参数的函数:你甚至可以传递多个函数,并在lambda中编写你想要的任何逻辑,就像其他函数一样:
但是callBack lambda函数的参数应该是已知的,你设置它的类型为:
() -> Unit
所以它不带任何参数。6ie5vjzr2#
目前不支持在回调函数中使用
vararg
,如果愿意,可以使用List
:hgtggwj03#
在Kotlin中你可以提供几个lambda函数到带有vararg的高阶函数,这没有问题。例如,像这样:
您可以按如下方式使用它:
或者甚至是这样:
UPD:如果要按函数名提供(如下所示:
newFun()
)您还可以考虑以下情况:当然还有: