ReactiveSwift SignalProducer:参数“失败”必须在参数“值”之前

时间:2018-07-23 16:17:56

标签: swift reactive-swift

我正在尝试使用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,所以我的代码不再编译。而且我有一条消息指出:

参数“失败”必须在参数“值”之前

1 个答案:

答案 0 :(得分:1)

对于那些具有默认值的Swift函数,您可以在调用站点根据需要对参数进行重新排序。 This feature was removed in Swift 3,这意味着您现在必须按照定义的顺序指定参数。因此,要调用on function,必须将value:参数移到末尾。