如何将协议更改为typealias或closure

时间:2017-04-26 10:15:05

标签: ios swift swift3 protocols

在我的代码中我不想使用协议我想使用闭包但我无法完成它因为我是Swift的新手。

以下是类

的示例
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)()
        }
    }

}

这是协议

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

当downloadConfig完成后,我希望在我的viewcontroller上有关闭以启动downloadDictionary。

我知道它如何处理Java这里是代码

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

            @Override
            public void onError(final AMError error) {

            }
        });

我想在swift中获得相同的结果。有人能给我建议怎么做吗?

更清楚的是,我希望摆脱SplashNetworkProtocol并仅使用闭包。

快速的结果应该是这个

mPresenter.startDownloadConfigs(onSuccess: {} onError{}

1 个答案:

答案 0 :(得分:0)

应该如此简单:

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

但更好的是使用一个处理成功和错误的闭包。例如,将错误作为可选参数:

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)
}

如果您需要有关Swift闭包语法的帮助,这是一个很好的资源: http://fuckingswiftblocksyntax.com/