Не удалось привести значение типа "__NSDictionaryM" (0x1055952b0) к "NSString" (0x1023e3c60)
Я использую http://www.omdbapi.com/?t=pulp+fiction IMDB api для "беллетристики" в моем коде.
В приложении есть панель поиска, и я пишу "Криминальное чтиво" в этой строке поиска, затем вводим. Я получаю эту ошибку.
Не удалось преобразовать значение типа "__NSDictionaryM" (0x1055952b0) в "NSString" (0x1023e3c60).
ViewController.swift:
//
// ViewController.swift
// IMDB Api Project
//
// Created by gurkan on 5.05.2017.
// Copyright © 2017 gurkan. All rights reserved.
//
import UIKit
class ViewController: UIViewController,UISearchBarDelegate {
@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var directorLabel: UILabel!
@IBOutlet weak var ratingLabel: UILabel!
@IBOutlet weak var actorsLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
searchBar.delegate = self
}
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchForMovie(title: searchBar.text!)
searchBar.text = ""
}
func searchForMovie(title: String){
//http://www.omdbapi.com/?t=pulp+fiction
if let movie = title.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed){
let url = URL(string: "http://www.omdbapi.com/?t=\(movie)")
let session = URLSession.shared
let task = session.dataTask(with: url!, completionHandler: { (data, response, error) in
if error != nil {
print(error!)
} else {
if data != nil {
do {
let jsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers)
as! String //Error Line!
let jsonString = jsonResult.components(separatedBy: "")
let jsonDict = jsonString as! Dictionary<String,String>
DispatchQueue.main.async {
print(jsonDict)
}
} catch {
}
}
}
})
task.resume()
}
}
}
Как я могу решить эту проблему?
1 ответ
Там две вещи не так.
Во-первых, эта линия разворачивается String
let jsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers)
as! String
Просто удалить as! String
- это не нужно. Свифт выведет тип и правильно создаст jsonResult
,
Во-вторых, ваш код предполагает, что возвращаемый ответ JSON - это словарь, полностью составленный из String
имена и String
ценности. Глядя на ответ от размещенного вами URL, объект, связанный с Ratings
значение на самом деле словарь. Так как вы разворачиваетесь силой jsonString
в словарь строк, который потерпит неудачу, так как это НЕ словарь строк. Это словарь строк и прочее - словарь.
Самое простое решение:
Заменить эту строку:
let jsonDict = jsonString as! Dictionary<String,String>
с
let jsonDict = jsonString as! [String: AnyObject]