在我的代码中,我不想使用协议,我想使用闭包,但我做不到,因为我是新的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/