2016-10-23 2 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'가 String으로 subscript 할 수있는 사전인지 어떻게 알 수 있습니까? – Alexander

답변

0

가장 짧은 빠른 수정이 라인을 변경하는 것 Any에 메소드 (아래 첨자 포함)를 적용 할 수 없습니다. 귀하의 코드에서 row 님의 유형은 Any으로 추측되며 row에 아래 첨자를 적용 할 수 없습니다.


조금 더 앞서 만들기 위해 코드를 더 스위프 티 및 안전 :

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 용 앱을 작성하는 경우 그러한 앱은 거부 될 위험이 있습니다. 백그라운드 스레드에서 내용을로드 해보십시오.

관련 문제