Json 解析错误:在 Swift iOS 中使用未声明的类型“Foundation”
Posted
技术标签:
【中文标题】Json 解析错误:在 Swift iOS 中使用未声明的类型“Foundation”【英文标题】:Json Parsing Error: use of undeclared type 'Foundation' in Swift iOS 【发布时间】:2018-10-06 16:13:53 【问题描述】:我正在使用 Swift 创建一个应用程序,我必须使用以下 URL 显示国家列表:
https://restcountries.eu/rest/v2/all
在这里我只需要获取name
密钥并添加到我的NSMutableArray
。当我尝试使用 URLSession 解析它时,出现错误:
expression produced error: error: /var/folders/_3/27lhgzw9699c4_yg37r72_d80000gp/T/expr40-bcf47d..swift:1:65: error: use of undeclared type 'Foundation'
Swift._DebuggerSupport.stringForPrintObject(Swift.UnsafePointer<Foundation.Data>(bitPattern: 0x105c0c2f0)!.pointee)
下面是我的代码:
func fetchCountryList(countryURL:URL, completion:@escaping (NSDictionary) -> ())
print(countryURL)
let request = NSMutableURLRequest( url: countryURL as URL)
let task = URLSession.shared.dataTask(with: request as URLRequest)
data, response, error in
do
if let data = data,
let jsonString = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
, error == nil
completion(jsonString)
else
print("error=\(error!.localizedDescription)")
let errorDict = ["error_status":true,"message":error!.localizedDescription] as [String : Any]
completion(errorDict as NSDictionary)
catch
print("error=\(error.localizedDescription)")
let errorDict = ["error_status":true,"message":error.localizedDescription] as [String : Any]
completion(errorDict as NSDictionary)
task.resume()
任何人都可以在这里建议我我的错误。提前致谢!
【问题讨论】:
不要在 Swift 中使用NSDictionary
。使用正确的 Swift 字典。不要在 Swift 中使用 NSMutableURLRequest
。使用URLRequest
。不要在 Swift 中使用 .mutableContainers
选项(一旦切换到 Swift 字典)。
【参考方案1】:
替换
try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
有
try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [[String: Any]]
由于它是一个对象数组,我们还需要将 json 转换为 array
要获得array of country names
,我们可以这样做:
guard let countries = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [[String: Any]] else
return
let countryNames = countries.map $0["name"] as! String
【讨论】:
没有必要在 Swift 集合中使用.mutableContainers
。
只需重用他的代码并稍作更改,以帮助他理解更简单的更改/少量更改。顺便说一句,感谢@rmaddy 的建议。【参考方案2】:
替换
let jsonString = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
与
if let result = try JSONSerialization.jsonObject(with: data, options:[]) as? [[String:Any]]
for item in result
print(item["name"])
响应是数组而不是字典也不要使用 NS 的东西
NSDictionary => [字符串:任意]
NSUrl => 网址
NSMutableURLRequest => URLRequest
func fetchCountryList(countryURL:URL, completion:@escaping (_ arr :[[String:Any]]?, _ error:Error?) -> ())
print(countryURL)
let request = URLRequest( url: countryURL)
let task = URLSession.shared.dataTask(with: request)
data, response, error in
do
if let data = data,
let jsonString = try JSONSerialization.jsonObject(with: data, options:[]) as? [[String:Any]]
, error == nil
completion(jsonString,nil)
else
print("error=\(error!.localizedDescription)")
let errorDict = ["error_status":true,"message":error!.localizedDescription] as [String : Any]
completion(nil,error)
catch
print("error=\(error.localizedDescription)")
let errorDict = ["error_status":true,"message":error.localizedDescription] as [String : Any]
completion(nil,error)
task.resume()
打电话
serviceModel.fetchCountryList(countryURL:countryURL) (result,error) in
if let res = result
print(res)
【讨论】:
嗨@Sh_Khan,感谢您的回复,替换后我收到错误:无法在此行中将类型“[[String:Any]]”的值转换为预期的参数类型“NSDictionary”:完成(jsonString) 我认为不需要状态,因为你不处理状态 false 所以我省略了它,只返回错误见编辑 好的,我将这个方法称为 :let serviceModel = ServiceModel() serviceModel.fetchCountryList(countryURL:countryURL) responsStr in 你能帮我调用这个方法以获得两个Completion吗?以上是关于Json 解析错误:在 Swift iOS 中使用未声明的类型“Foundation”的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 在 Swift 中使用 NSJSONSerialization 解析 JSON 字典
如何以正确的方式在 IOS SWIFT 3 中解析 Google 距离矩阵 API JSON