2017-04-26 7 views
1

私のコードではプロトコルを使いたくありません。クローズを使用したいのですが、私はSwiftで新しくなっています。ここでプロトコルをtypealiasまたはclosureに変更するには

はここでクラス

class SplashPresenterImp: SplashPresenter, OnFinishedListener { 

    private var interactor: SplashInteractor 
    private var splashNetworkProtocol: SplashNetworkProtocol 


    init() { 
     interactor = SplashNetworking() 
    } 

    func startDownloadConfigs(splashNetworkProtocol: SplashNetworkProtocol){ 
     if interactor != nil { 
      interactor.loadConfigs(listener: self) 
      self.splashNetworkProtocol = splashNetworkProtocol 
     } 
    } 

    func startDownloadDictionary(splashNetworkProtocol: SplashNetworkProtocol) { 
     if interactor != nil { 
      interactor.loadDictionary(listener: self) 
      self.splashNetworkProtocol = splashNetworkProtocol 
     } 
    } 

    func onFinishedGetDictionary(dictionary: Dictionary) { 
     //save dictionary 
     if splashNetworkProtocol != nil { 
      splashNetworkProtocol.onSuccess() 
     } 
    } 
    func onFinishedGetConfigs(config: Config) { 
     //save configs 
     if splashNetworkProtocol != nil { 
      splashNetworkProtocol.onSuccess() 
     } 
    } 
    func onFinishedWithError(error: AMError) { 
     if splashNetworkProtocol != nil { 
      splashNetworkProtocol.onError(error: error)() 
     } 
    } 

} 

の一例である私はdownloadConfigがdownloadDictionaryを開始する完了したときに閉鎖を持っている私のViewControllerにしたいどのようなプロトコル

protocol SplashNetworkProtocol: class { 
    func onSuccess() 
    func onError(error: AMError) 
} 

です。私はそれがここにJavaを扱う方法を知っている

は私が迅速に同じ結果を持ちたいコード

mPresenter.startDownloadConfigs(new SplashNetworkProtocol() { 
      @Override 
      public void onSuccess() { 
       downloadDictionary(); 
      } 

      @Override 
      public void onError(final AMError error) { 

      } 
     }); 

です。誰も私にこれを行う方法のアドバイスを与えることができますか?

さらに明確に私はSplashNetworkProtocolを取り除き、閉鎖のみを使用したいと思います。

func startDownloadDictionary(onSuccess:() -> Void, onError:() -> Void) 

しかし、成功とエラーの両方を処理する単一の閉鎖を使用してさらに良い:

迅速な結果がこの

mPresenter.startDownloadConfigs(onSuccess: {} onError{} 

答えて

0

は同じくらい簡単であるべきである必要があります。たとえば、オプションのパラメータとしてエラーで:

func startDownloadDictionary(onCompletion: (Error?) -> Void) 

フル例:

func someOtherFunc() { 
    startDownloadDictionary(onCompletion: {(error) -> Void in 
     if let error = error { 
      print(error.localizedDescription) 
     } 
     //no error 
    }) 
} 

func startDownloadDictionary(onCompletion: (Error?) -> Void) 
{ 
    //dostuff 
    var error: Error? 
    // if error happens, create it 
    onCompletion(error) 
} 

あなたはスウィフトクロージャ構文でヘルプが必要な場合、これは良いリソースです: http://fuckingswiftblocksyntax.com/

+0

何SplashPresenterImpクラスを変更する必要がありますか?私は代わりに何かを宣言したいSplashNetworkProtocol – pmb

+0

必要なすべての情報は上記の答えに含まれています。 – Oskar

+0

しかし、コールバックはonFinishedGetDictionaryまたはonFinishedGetConfigsを呼び出す必要があります – pmb

関連する問題