我正在尝试使用ReactSwift更新旧代码的升级,因为我想用XCode 9运行它。我定义了一个Network类。
final class Network: NSObject {
static func request(_ URLRequest: URLRequestConvertible) -> SignalProducer<Any, NetworkError> {
return SignalProducer { sink, disposable in
Alamofire.request(URLRequest)
.validate()
.responseJSON { response in
switch response.result {
case .success(let value):
sink.send(value: value)
sink.sendCompleted()
case .failure(let error):
// modification en as NSError
sink.send(error: NetworkError(error: error as NSError))
}
}
}
}
}
使用泛型类型在函数中调用的
private func fetch<T: Himotoki.Decodable>(URLRequest: URLRequestConvertible) -> SignalProducer<T, NetworkError> {
return Network.request(URLRequest)
.attemptMap { JSON in
do {
return .success(try decodeValue(JSON) as T)
} catch let error {
return .failure(.incorrectDataReturned)
}
}
}
通用函数用于使用Alamofire发出网络请求,如下所示。
// Get static UserData
static func fetchUserData() -> SignalProducer<UserData, NetworkError> {
return fetch(URLRequest: MoneyCupUsersBackEndRouter.getUserData)
}
所以,我打电话:
API.fetchUserData()
.on(started: {
SVProgressHUD.show()
},
value: { cfg in
globalConfig = cfg
},
failed: { [weak self] error in
self?.view.window?.dodo.error("Impossible de récupérer la configuration globale")
},
terminated: {
SVProgressHUD.dismiss()
})
.start()
}
此方案以前效果很好,我的代码中有很多方案。但是由于我已经升级到ReactiveCocoa,所以我的代码不再编译。而且我有一条消息指出:
参数“失败”必须在参数“值”之前
答案 0 :(得分:1)
对于那些具有默认值的Swift函数,您可以在调用站点根据需要对参数进行重新排序。 This feature was removed in Swift 3,这意味着您现在必须按照定义的顺序指定参数。因此,要调用on
function,必须将value:
参数移到末尾。