Не удалось привести значение типа "__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]
Другие вопросы по тегам