【问题标题】:Could not cast value of type '__NSDictionaryM' (0x1055952b0) to 'NSString' (0x1023e3c60)无法将“__NSDictionaryM”(0x1055952b0)类型的值转换为“NSString”(0x1023e3c60)
【发布时间】:2017-10-08 03:41:44
【问题描述】:

我在我的代码中使用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()
        }
    }
}

我该如何解决这个问题?

【问题讨论】:

  • 您的 JSON 是字典,而不是字符串。
  • 我像字典一样尝试过,但我之前遇到过错误。那么如何解决呢?全部代码是什么?

标签: ios json swift swift3 imdb


【解决方案1】:

有两件事不对。

首先,这条线强制展开为String

let jsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers)
                            as! String

简单删除as! String - 不需要。 Swift 将推断类型并正确创建jsonResult

其次,您的代码假定返回的 JSON 响应是一个完全由 String 名称和 String 值组成的字典。查看您发布的 url 的响应,与 Ratings 值关联的对象实际上是一个字典。由于您强制将 jsonString 解包到字符串字典中,这将失败,因为它不是字符串字典。它是字符串和其他内容的字典 - 字典。

最简单的解决方法是:

替换这一行:

let jsonDict = jsonString as! Dictionary<String,String>

let jsonDict = jsonString as! [String: AnyObject]

【讨论】:

  • 我在这一行遇到了同样的错误。有问题的行是:让 jsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! String 所以我认为我们应该改变这一行。
  • 哦,是的,同时删除“as!String”
  • 我在评论(删除)“as!String”i.hizliresim.com/z3N2W4.png时收到此错误
  • 删除那一行,不需要
  • 我用您编辑的答案更新了我的代码,但我仍然遇到同样的错误。点击红色之前i.hizliresim.com/W0j4Zq.png点击红色之后i.hizliresim.com/r3Gjgz.png
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 2019-02-03
  • 2019-01-10
  • 2016-06-06
  • 1970-01-01
  • 2021-10-02
相关资源
最近更新 更多