2016-11-06 9 views
0

사용자 정의 프로토콜은

" 'viewcontainer'외부 범위에 정의 된 값을 통해 닫을 수 없습니다 클래스 선언"이 오류가 난 네트워크 프로토콜이 에게 sucessResponse 및 onErrorResponse에 두 가지 방법이 NetworkResponse라고 만들었습니다.

은 그럼 방법이 있음을 구현하는 NetworkResponse 및 강제에서 확장콜백라는 클래스가 있습니다. 나는 익명의 클래스에서 컨트롤러를 기각 할

public func login (callback : Callback, viewController : UIViewController) { 



     let callbackInstance: NetworkResponse = { 

      class callback : Callback { 



       override func onSucessResponse(response : NSDictionary){ 

        viewController.dismiss(animated: true, completion: nil) 

       } 
       override func onErrorResponse(message : String, code : Int){ 
        print("error") 
       } 
      } 

      return callback() 
     }() 

     postPath(callback: callbackInstance as? Callback) 

} 

:

여기 내 기능입니다.

추천?

+0

자바 개발자 일 가능성이 있습니까? – NRitH

+0

예. 신속한 새로운 사람 –

+1

'onSuccess'와'onError' 콜백을 정의하기 위해'protocol' 대신'closure'를 사용해야한다고 생각합니다. – Enix

답변

1

프로토콜 및 콜백 클래스를 정의 할 필요가 없습니다. 폐쇄는 필요한 것입니다.

import UIKit 

public class TestInnerClass: UIViewController { 

    public func login(successCallback: ((response: NSDictionary) -> Void), errorCallback: ((message: String, code: Int) -> Void)) { 

     let success = false 
     let response = NSDictionary() 

     // 
     // Make your login request here, and change the `success` value depends on your response 
     // let response = ... 
     // 
     // If you are making a async request to login, then put the following codes inside your request callback closure. 
     // 

     if success { 
      successCallback(response: response) 
     } else { 
      errorCallback(message: "error occurred", code: -1) 
     } 
    } 

    override public func viewDidLoad() { 
     super.viewDidLoad() 

     login({ 
       (response) in 
       // Get Called when success 
       self.dismissViewControllerAnimated(true, completion: nil) 
      }, errorCallback: ({ 
       // Get called when failed 
       (message, code) in 
       print(message) 
      })) 
    } 
} 

내 Github에서의 환매 특약에 사건에 대한 몇 가지 sample codes을 작성했습니다,이 예제는 그냥 참조를 위해, 네트워크 요청을 만들기 위해 Alamofire을 사용하고 있습니다.

추신 : 아직도 Xcode 7.3.1을 사용하고 있으므로 위의 코드를 변경해야 swift 3 구문 요구 사항을 적용 할 수 있습니다.

+0

우수 답변. 아니 프로토콜을 사용하여 !! 클로저 사용 :) –