2017-04-23 10 views
1

이 Kotlin 함수로 작업하고 있습니다. 나는 우리가 이라는 함수를 가지고 있는데, 그 매개 변수는 TextView.OnEditorActionListener이지만 그 뒤에 무엇이 있는가? 매개 변수 안에 중괄호가 있습니까?이 Kotlin 함수 구조체를 설명하십시오.

mPasswordView!!.setOnEditorActionListener(TextView.OnEditorActionListener { textView, id, keyEvent -> 
    if (id == R.id.login || id == EditorInfo.IME_NULL) { 
     attemptLogin() 
     [email protected] true 
    } 
    false 
}) 
+0

오케이 내 실수. 그것은 함수가 아닙니다 ... –

답변

4

예제에 사용 된 기능은 SAM constructor입니다. setOnEditorActionListener 청취자는 OnEditorActionListener을 매개 변수로 사용합니다. 이 인터페이스는 구현해야하는 단일 메소드 만 가지고있어서 SAM (Single Abstract Method) 인터페이스로 만듭니다.

것 자바에서이 방법을 사용하기위한 전체 구문 :

mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     attemptLogin(); 
     return true; 
    } 
}); 

코 틀린에 일대일 변환이 당신에게 줄 것이다 :

mPasswordView.setOnEditorActionListener(object: TextView.OnEditorActionListener{ 
    override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean { 
     attemptLogin() 
     return true 
    } 
}) 

코 틀린은, 그러나, 당신을 수 있습니다 SAM 인터페이스를 매개 변수로 사용하는 메서드를 사용하여보다 간결한 구문으로 람다 대신 전달합니다. 이것은 SAM 변환을 호출됩니다

mPasswordView.setOnEditorActionListener { v, actionId, event -> 
    attemptLogin() 
    true 
} 

SAM 변환이 자동으로 람다에 해당하는 인터페이스를 결정하지만, 당신이 SAM 생성자라는 것을 사용하여 명시 적으로 지정할 수 있습니다,이 샘플 코드에서 무엇이다. SAM 생성자는 주어진 인터페이스를 구현하는 객체를 반환하고 전달한 람다를 단일 메소드의 구현으로 만듭니다.

mPasswordView.setOnEditorActionListener(TextView.OnEditorActionListener { v, actionId, event -> 
    attemptLogin() 
    true 
}) 

setOnEditorActionListener라는 단 하나의 방법이 있기 때문이 특정 상황에서 중복됩니다. 그러나 동일한 이름을 가진 여러 메소드가 매개 변수로 다른 인터페이스를 사용하는 경우 SAM 생성자를 사용하여 호출 할 메소드의 오버로드를 지정할 수 있습니다.

Official docs about SAM conversions

+1

그리고'@ OnEditorActionListener'는 무엇을 위해 필요합니까? – azizbekian

+1

중첩 된 함수가있는 경우 반환 할 함수를 지정하는 데이 구문을 사용할 수 있습니다. 여기를 참조하십시오 : https://kotlinlang.org/docs/reference/returns.html#return-at-labels. 사실이 특정 경우에는 중복되는 것 같습니다. – zsmb13

0

그래서 다른 단어 구조는가 (난 그냥 여기를 떠나 사람입니다 것입니다 도움을 이해 필요) 다음과 같다 :

function_A (parameters_A { override_parameters_B -> override_function_B })  

overriden_function_B라는 객체의 생성자를 parameters_A.