>

Android에서는 함수 호출 중에 인터페이스 메소드를 구현할 수 있습니다. 예를 들어 인터페이스 및 함수 선언은 다음과 같습니다.

//interface
interface exampleCallback {
    void success(String response);
    void error(String error);
}
//function
void exampleFunction(exampleCallback cb) {
    //do something
}

그리고 함수 호출 :

exampleFunction(new exampleCallback() {
    @Override
    public void success(String response) {
        //custom method implementation
    }
    @Override
    public void error(String error) {
        //custom method implementation
    }
});

즉, 성공/오류 방법은 exampleFunction의 각 함수 호출에 대해 사용자 정의 할 수 있습니다. 그러나 일부 Google 검색 후 클래스 또는 구조체 선언에서 프로토콜 메소드를 구현하기위한 예제 코드 만 찾을 수 있으며 메소드는 더 이상 사용자 정의 할 수 없습니다. 나는 목표를 달성하기 위해 함수 매개 변수로 이스케이프 클로저를 전달할 수 있다는 것을 알고 있습니다. 즉, 각 함수 호출에 대해 콜백 함수를 사용자 정의하십시오. 하지만 프로토콜을 사용하여 비슷한 일을 할 수 있는지 궁금합니다 ...


  • 답변 # 1

    관련된 값으로 열거를 만들 수 있습니다 :

    enum Result {
        case success(String)
        case error(CustomError)
    }
    enum CustomError: Error {
        case expired(String)
    }
    
    

    그리고 메소드의 완료 핸들러에서 열거 사례를 사용하여 사용자 정의 문자열을 전달하십시오.

    func exampleFunction(completion: @escaping (Result) -> ()) {
        if condition {
            completion(.success("Success String"))
        } else {
            completion(.error(.expired("Error String"))) 
        }
    }
    
    

    메서드를 호출 할 때 열거를 바꾸고 거기에서 커스텀 구현을 수행하고 콜백에 반환 된 관련 값을 사용할 수 있습니다 :

    exampleFunction { result in
        switch result {
        case let .success(response):
            // custom method implementation
            // use your (response) string here
        case let .error(error):
            // custom method implementation
            // use your (error.localizedDescription) string here
        }
    }
    
    

    운동장 샘플

  • 답변 # 2

    Java의 익명 클래스는 실제로 "일등 시민"이라는 기능이없는 경우 "해결책"입니다.

    신속하게 함수는 일급 시민이므로 실제로 단일 메소드를 구현하는 익명 클래스를 전달할 필요는 없습니다. 그 방법을 전달하면됩니다 (Java 8의 람다와 비슷합니다).

    이것은 자바에서 :

    interface ActionListener {
        void actionPerformed();
    }
    
    

    Swift에서 클로저 유형으로 나타낼 수 있습니다 :

    () -> Void
    
    

    이 대신에 :

    someMethod(new ActionListener() {
        public void actionPerformed() { ... }
    });
    
    

    이 작업은 Swift에서 수행합니다 :

    someMethod { ... }
    
    
    <시간>

    자바 인터페이스에 구현할 메소드가 여러 개인 경우 어떻게됩니까?

    이 경우 하나의 클로저를 사용하여 모든 클로저를 나타낼 수 없습니다.

    여러 메소드로 프로토콜을 작성하고 구조체 나 클래스로 구현하십시오. 이 패턴은 UIKit 에서 많이 볼 수 있습니다 . 뷰 및 뷰 컨트롤러에는 종종 XXXDelegate 가 있습니다. .

    튜플 클로저 통과

관련 자료

  • 이전 c++ - cpp에서 런타임에 typecast하고 객체를 만드는 방법은 무엇입니까?
  • 다음 screen scraping - Python Beautiful Soup, 'data-id'를 검색하는 방법