我有这段代码:


 struct ServerConnect {
枚举结果< T> {
案例成功(T)
 case error(String)
 }

 typealias completionHandler =(结果<数据>) - > ()

 func getJsonFromServer(参数:String,completion:@escaping completionHandler){
 let fullUrlString = ApiConstans.fullPath + parameters
 guard let url = URL(string:fullUrlString)else {
 debugPrint( “\(ErrorsLabels.ServerConnect01)”)
返回完成(.error(“\(ErrorsLabels.ServerConnect01)”))
 }

 
中的URLSession.shared.dataTask(with:url){(data,response,error)警卫错误== nil else {
 debugPrint( “\(ErrorsLabels.ServerConnect02)”)
返回完成(.error(“\(ErrorsLabels.ServerConnect02)”))
 }

 guard let data = data else {
 debugPrint( “\(ErrorsLabels.ServerConnect03)”)
返回完成(.error(“\(ErrorsLabels.ServerConnect03)”))
 }

 debugPrint(“R> \(fullUrlString)”)
返回完成(.succes(data))
 } .resume()
 }


 func getJsonProducts(lang:String?,region:Int?,completion:@escaping completionHandler){
 self.getJsonFromServer(参数:“?action = GET_PRODUCTS& lang = \(lang!)& region = \(region!)”,完成:完成)
 }

}

&#xA;&#xA; 我想将下载的数据从互联网保存在设备的内存中。< / p>&#xA;&#xA;
我正在尝试此代码:
&#xA;&#xA; getJsonProducts(lang:selectedLanguage,region:selectedRegion,completion :{(data)in&#xA; print(“@@@@@(data)”)&#xA; saveJsonFileToTheDisk(path:selectedLanguage +“/ json / products.json”,downloadData:data)&#xA; } && xA;&#xA; func saveJsonFileToTheDisk(path:String,downloadData:Data){&#xA;做{&#xA; let documentsURL = FileManager.default.urls(for:.documentDirectory,in:.userDomainMask).first!&#xA; let fileURL = documentsURL.appendingPathComponent(path)&#xA;尝试downloadData.write(to:fileURL,options:.atomic)&#xA; } catch {}&#xA; }&#xA;
&#xA;&#xA; 但不幸的是它不起作用。我怎样才能使它工作?
&#xA;&#xA;以下是一个错误:
&#xA;&#xA;&#xA;&#xA;无法将“ServerConnect.Result”类型的值转换为预期的&#xA;参数类型'数据'
&#xA;
答案 0 :(得分:0)
根据getJsonProducts
方法的定义:
func getJsonProducts(lang: String?, region: Int?, completion: @escaping (Result<Data>) -> ()) {
发送到data
块的参数completion
实际上是包含数据的Result
类型,而不是数据本身。因此,您应该这样做:
getJsonProducts(lang: selectedLanguage, region: selectedRegion, completion: { result in
switch result {
case .succes(let data):
saveJsonFileToTheDisk(path: selectedLanguage + "/json/products.json", downloadData: data)
case .error(let errorMessage):
// Do something with the error message.
break
}
})
答案 1 :(得分:0)
来自NA
的{{1}}会返回completionHandler
,而不是简单的getJsonProducts
,因此您需要对Result<Data>
实例进行模式匹配,因为它可能不会实际上包含Data
,可能包含Result
错误。
Data