在我的代码中,我不想使用协议,我想使用闭包,但我做不到,因为我是新的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上有闭包来启动downloadconfictionary。
我知道它是如何处理Java的,下面是代码
mPresenter.startDownloadConfigs(new SplashNetworkProtocol() {
            @Override
            public void onSuccess() {
                downloadDictionary();
            }

            @Override
            public void onError(final AMError error) {

            }
        });

我想在斯威夫特有同样的结果。有人能给我建议怎么做吗?
更清楚地说,我希望去掉SplashNetworkProtocol并只使用闭包。
迅速的结果应该是
mPresenter.startDownloadConfigs(onSuccess: {} onError{}

最佳答案

应该简单到:

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/

关于ios - 如何将协议(protocol)更改为类型别名或闭包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43631262/

10-15 07:34