2014-03-02 3 views
13

콜백을 포함하는 변수가 있으며 기본적으로 값은 null이어야합니다. 하지만이 구문은 효과가없는 것 같습니다.Kotlin의 함수 유형 변수에 null 값을 할당하는 방법은 무엇입니까?

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

현재 해결책은 콜백에 기본 구현이 있는지 확인하는 것입니다. (그래서인가?)

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

그러나, 콜백이 설정되었는지 여부를 확인하기 위해 열심히하게, 그리고 아마도 기본 구현은 약간의 비용으로 제공됩니다. Kotlin의 함수 유형 변수에 null 값을 할당하는 방법은 무엇입니까?

답변

19

Kotlin의 모든 변수와 마찬가지로 함수 참조는 일반적으로 null 일 수 없습니다. null 값을 허용하기 위해, 당신은과 같이, 타입 정의의 마지막에 ?를 추가 할 수 있습니다

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

당신은 일반적으로 전체 기능 유형 선언 괄호가 필요합니다. 그것이 필요하지 않더라도, 아마 좋은 생각입니다. 또한 널 안전 연산자 invoke를 사용하여 함수를 호출해야합니다

callback1?.invoke() 

아무것도 실시하지 않는 구현 방식은 아마도 장기적으로 더 편리합니다, 그리고에 좀 더 "코 틀린-Y '보인다 나를. 컴퓨터 과학에서 대부분 그렇듯이 문제가 있음을 나타내는 특정 성능 데이터가 없다면 기본 구현의 성능 비용을 걱정하지 않아도됩니다. 이 도움이

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

희망 : null 값을 허용하지 않고 콜백이 설정되어 있는지 확인하려면

한 가지 방법은 null object pattern을 사용하는 것입니다!

+0

nullable 참조 함수를 호출 할 때'명백히 사용합니까? '오류가 표시됩니다? .invoke()'any solution? – UnKnown

+1

그건 완벽하게 이해가됩니다. 'blah? .invoke()'는 "null이 아닌 경우 blah를 호출합니다"을 의미합니다. 이는 blah가 null 일 수있는 경우에 필요합니다. 해결책은 정확히 그것을하는 것입니다. 나는 이것을 명확히하기 위해 대답을 업데이트 할 것이다. –