0

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

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

4

1 回答 1

1

过去,对于参数具有默认值的 Swift 函数,您可以在调用站点根据需要对参数重新排序。这个特性在 Swift 3 中被移除了,这意味着你现在必须按照定义的顺序来指定参数。因此,对于on 函数的调用,您必须将value:参数移到末尾。

于 2018-07-25T16:20:57.757 回答