2014-03-02 20 views
13

我有一個持有回調的變量,默認情況下它的值應該爲null。但是這個語法似乎不起作用。如何在Kotlin中爲函數類型變量賦一個空值?

var callback1 :() -> Unit = null 
var callback2 : ((a) -> c, b) -> Unit = null 

我目前的解決方案是確保回調具有默認實現。

var callback1 :() -> Unit = { } 
var callback2 : ((a) -> c, b) -> Unit = { a, b -> } 

然而,這使得它很難檢查回調是否被設置,並可能默認實現是以犧牲成本(是這樣的嗎?)。如何爲Kotlin中的函數類型變量賦一個空值?

回答

19

與Kotlin中的所有變量一樣,函數引用通常不能爲空。爲了允許空值,你必須一個?添加到類型定義的結尾,就像這樣:

var callback1 : (() -> Unit)? = null 
var callback2 : (((a) -> c, b) -> Unit)? = null 

你通常需要圍繞整個函數類型聲明括號。即使這不是必需的,這可能是一個好主意。您還需要調用使用invoke與空安全操作員的功能:

callback1?.invoke() 

的什麼都不做的實現方法可能是從長遠來看更方便,而且似乎有點更「科特林-Y」來我。與計算機科學中的大多數情況一樣,除非您有指出問題的具體性能數據,否則我不會擔心默認實現的性能成本。

一種方法來確定,而不允許空值如果回調已設置將使用null object pattern

val UNSET_CALLBACK1:() -> Unit = {} 
var callback1 :() -> Unit = UNSET_CALLBACK1 
fun callback1IsSet(): Boolean { 
    return callback1 !== UNSET_CALLBACK1 
} 

希望這有助於!

+0

當我調用可空引用函數,然後我看到錯誤'顯式使用'?.invoke()'任何解決方案? – UnKnown

+1

這很有道理。 'blah?.invoke()'表示「如果它不爲null,則調用blah」,如果blah可能爲null,則這是必需的。解決方案就是要做到這一點。我會更新答案來澄清這一點。 –

相關問題