2016-10-23 1 views
0

Ich habe Probleme mit diesem Fehler.Typ 'NSFastEnumerationIterator.Element' hat keine tiefgestellten Mitglieder

Würdest du mir sagen, wie ich diesen Code am Training repariere?

Jede Hilfe wird geschätzt.

// Dies sind JSON-Daten.

{ 
    "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" 
     }, ... 

// Dies ist Code.

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

Wie soll der Compiler wissen, dass 'row' ein Wörterbuch ist, das Sie mit einem String indizieren können? – Alexander

Antwort

0

Der kürzeste schnelle Lösung würde diese Linie sich ändern:

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

etwas wie folgt aus:

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

In Swift 3, der Elementtyp von NSArray hat Any werden, und Sie können keine Methoden (einschließlich Index) auf Any anwenden. In Ihrem Code wird der Typ row als Any abgeleitet und Sie können keinen Index auf row anwenden.


Ein wenig mehr vor Ihren Code Swifty zu machen und sicherer:

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 
    } 
} 

Und ein wenig mehr ...

Data(contentsOf:) (oder NSData(contentsOf:)) können unbestimmte Zeit in Anspruch nehmen und blockiert den Hauptthread, bis die gesamten Daten empfangen sind. Wenn Sie eine App für den App Store schreiben, besteht die Gefahr, dass eine solche App abgelehnt wird. Versuchen Sie, den Inhalt in einen Hintergrundthread zu laden.

Verwandte Themen