2017-05-09 11 views
1

私のコードで "pulp fiction"にhttp://www.omdbapi.com/?t=pulp+fiction IMDB apiを使用しています。タイプ '__NSDictionaryM'(0x1055952b0)の値を 'NSString'(0x1023e3c60)にキャストできませんでした

アプリケーションに検索バーがあり、この検索バーに「パルプフィクション」と書いて入力します。 このエラーが発生します。

は、型の値をキャストすることができませんでした '__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() 
     } 
    } 
} 

どのように私はこの問題を解決することができますか?

+0

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

は、この行を置き換えます。 – rmaddy

+0

辞書のようにしようとしましたが、前にエラーが出ます。どのように解決するのですか?すべてのコードは何ですか? –

答えて

1

2つのことが間違っています。それが必要ではない -

まず、この行力がString

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

シンプル削除as! Stringにアンラップします。 Swiftはタイプを推測し、正しくjsonResultを作成します。

第2に、あなたのコードは、戻ってくるJSON応答が、Stringという名前とStringの値で完全に構成された辞書だと仮定しています。あなたが投稿したURLからの応答を見ると、Ratings値に関連付けられたオブジェクトは実際には辞書です。文字列の辞書にはjsonStringを強制的にアンラップしているので、それは文字列の辞書ではないので失敗します。それはストリングスや他のものの辞書、つまり辞書です。

最も簡単な修正は次のとおりです。あなたのJSON辞書、ない文字列である

let jsonDict = jsonString as! [String: AnyObject] 
+0

この行で同じエラーが発生しています。 問題のある行は次のとおりです。 let jsonResult = try JSONSerialization.jsonObject(with:data !, options:JSONSerialization.ReadingOptions.mutableContainers) as! String 私はこの行を変更する必要があると思います。 –

+0

ありがとうございます。「as!String!」も削除します –

+0

私の回答が –

関連する問題