我有一个包含回调的变量,默认情况下它的值应为null。但是这种语法似乎不起作用。
var callback1 : () -> Unit = null
var callback2 : ((a) -> c, b) -> Unit = null
我目前的解决方案是确保回调具有默认实现。
var callback1 : () -> Unit = { }
var callback2 : ((a) -> c, b) -> Unit = { a, b -> }
然而,这使得很难检查回调是否已设置,并且可能默认实现需要一定的成本(是这样吗?)。如何在Kotlin中为函数类型变量赋值空值?
答案 0 :(得分:43)
与Kotlin中的所有变量一样,函数引用通常不能为null。为了允许空值,您必须在类型定义的末尾添加?
,如下所示:
var callback1 : (() -> Unit)? = null
var callback2 : (((a) -> c, b) -> Unit)? = null
整个函数类型声明通常需要括号。即使它不是必需的,也可能是个好主意。您还需要使用invoke
使用null-safe运算符调用该函数:
callback1?.invoke()
从长远来看,无操作的实现方法可能更方便,而且对我来说似乎有点“kotlin-y”。与计算机科学中的大多数事情一样,我不担心默认实现的性能成本,除非您有特定的性能数据表明它是一个问题。
确定是否在不允许空值的情况下设置回调的一种方法是使用null object pattern:
val UNSET_CALLBACK1: () -> Unit = {}
var callback1 : () -> Unit = UNSET_CALLBACK1
fun callback1IsSet(): Boolean {
return callback1 !== UNSET_CALLBACK1
}
希望这有帮助!