2016-10-23 28 views
0

このエラーには問題があります。タイプ 'NSFastEnumerationIterator.Element'には添え字メンバーがありません

このコードをトレーニングする方法を教えてください。

ご協力いただければ幸いです。

//これはJSONデータです。

{ 
    "boxOfficeResult":{ 
     "boxofficeType":"일별 박스오피스", 
     "showRange":"20161020~20161020", 
     "dailyBoxOfficeList":[ 
     { 
      "rnum":"1", 
      "rank":"1", 
      "rankInten":"0", 
      "rankOldAndNew":"OLD", 
      "movieCd":"20153444", 
      "movieNm":"럭키", 
      "openDt":"2016-10-13", 
      "salesAmt":"1452501900", 
      "salesShare":"60.2", 
      "salesInten":"-85908900", 
      "salesChange":"-10", 
      "salesAcc":"23329189948", 
      "audiCnt":"193801", 
      "audiInten":"-11203", 
      "audiChange":"-10", 
      "audiAcc":"2879481", 
      "scrnCnt":"968", 
      "showCnt":"4961" 
     }, ... 

//これはコードです。

 let dailyBoxOfficeList = boxOfficeResult["dailyBoxOfficeList"] as! [[String: Any]] 

はスウィフト3では、NSArrayの要素型がAnyとなっており、このような何かに

 let dailyBoxOfficeList = boxOfficeResult["dailyBoxOfficeList"] as! NSArray 

var list = Array<MovieVO>() 

override func viewDidLoad() { 

    let apiURI = NSURL(string: "http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=a7497a5e700fdff2f3fd468b604d9d18&targetDt=20161020") 

    let apidata : NSData? = NSData(contentsOf: apiURI! as URL) 

    NSLog("result = %@", NSString(data: apidata! as Data, encoding: String.Encoding.utf8.rawValue)!) 


    do { 
     let apiDictionary = try JSONSerialization.jsonObject(with: apidata! as Data, options: []) as! NSDictionary 

     let boxOfficeResult = apiDictionary["boxOfficeResult"] as! NSDictionary 
     let dailyBoxOfficeList = boxOfficeResult["dailyBoxOfficeList"] as! NSArray 

     var mvo : MovieVO 

     for row in dailyBoxOfficeList { 
      mvo = MovieVO() 

      mvo.rank = row["rank"] as? String // error occur 
      mvo.movieNm = row["movieNm"] as? String 
      mvo.openDt = row["openDt"] as? String 
      mvo.audiCnt = row["audiCnt"] as? String 

      self.list.append(mvo) 
     } 

    } catch { 

    } 
} 
+0

コンパイラは、 'row'が文字列を添字にできる辞書であることをどのように知っていますか? – Alexander

答えて

0

最短クイックフィックスは、この行を変更することになりますAnyには、任意のメソッド(下付き文字を含む)を適用することはできません。あなたのコードでは、rowのタイプはAnyと推定されており、添え字をrowに適用することはできません。


もう少し先に作るためにあなたのコードよりSwiftyで安全:

enum MyError: Error { 
    case badURL 
    case notDictionary 
    case invalidBoxOfficeResult 
    case invalidDailyBoxOfficeList 
} 
override func viewDidLoad() { 

    do { 
     //Use `URL` rather than `NSURL` 
     guard let apiURI = URL(string: "http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=a7497a5e700fdff2f3fd468b604d9d18&targetDt=20161020") else { 
      throw MyError.badURL 
     } 

     //Use `Data` rather than `NSData` 
     //Avoid using forced unwrapping 
     let apidata = try Data(contentsOf: apiURI) 

     //Use `String` rather than `NSString` 
     NSLog("result = %@", String(data: apidata, encoding: .utf8)!) 

     //Cast the resutl of type `Any` as soon as possible 
     guard let apiDictionary = try JSONSerialization.jsonObject(with: apidata) as? [String: Any] else { 
      throw MyError.notDictionary 
     } 

     //Cast the resutl of type `Any` as soon as possible 
     guard let boxOfficeResult = apiDictionary["boxOfficeResult"] as? [String: Any] else { 
      throw MyError.invalidBoxOfficeResult 
     } 

     //Cast the resutl of type `Any` as soon as possible 
     guard let dailyBoxOfficeList = boxOfficeResult["dailyBoxOfficeList"] as? [[String: String]] else { 
      throw MyError.invalidDailyBoxOfficeList 
     } 

     for row in dailyBoxOfficeList { 
      var mvo = MovieVO() //<- Assuming `MovieVO` is a struct, use `let` if it is a class 

      mvo.rank = row["rank"] 
      mvo.movieNm = row["movieNm"] 
      mvo.openDt = row["openDt"] 
      mvo.audiCnt = row["audiCnt"] 

      self.list.append(mvo) 
     } 

    } catch { 
     print(error) //<- You should not ignore errors 
    } 
} 

そして、もう少し...

Data(contentsOf:)(またはNSData(contentsOf:))が無期限の時間を消費するかもしれませんデータ全体が受信されるまでメインスレッドをブロックします。あなたがApp Store用のアプリを書く場合、そのようなアプリは拒否される危険性があります。バックグラウンドスレッドで内容をロードしてみてください。

関連する問題