2016-11-14 76 views
-3

我正在從JSON中獲取一個多維數組並嘗試將其存儲到一個NSArray對象中。然後我想通過選取器迭代該對象。這工作在Swift 2上,但是一旦我轉換爲swift 3,在我的pickerView函數中得到'Type Any沒有下標成員'的錯誤。Swift 3 JSON多維NSArray字符串

相關的代碼(名字和麪孔改變):

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    let ticket_number = pvds_ticket_number[row]["ticket_number"] as! String 
    let customer_name = pvds_ticket_number[row]["customer_name"] as! String 
    return "\(ticket_number) - \(customer_name)" 
} 

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
{ 
    let ticket_number = pvds_ticket_number[row]["ticket_number"] as! String 
    txt_ticket_number.text = ticket_number 
} 

func get_tickets() 
{ 
    let userID = UserDefaults.standard.string(forKey: "userID") 
    let url_path: NSString = "my_url_that_isnt_relevant" as NSString; 
    let url_path_formatted: NSString = url_path.addingPercentEscapes(using: String.Encoding.utf8.rawValue)! as NSString 

    let url = URL(string: url_path_formatted as String) 
    let session = URLSession.shared 

    let task = session.dataTask(with: url!, completionHandler: {data, response, error -> Void in 

     if(error != nil) { 
      // If there is an error in the web request, print it to the console 
      print(error!.localizedDescription) 
     } 


     do { 
      let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary 

      if let parseJSON = json { 
       if let results: NSArray = parseJSON["results"] as? NSArray{ 
        DispatchQueue.main.async(execute: { 
         self.pvds_ticket_number = results as! [Any] as NSArray 
         self.pv_ticket_number.reloadAllComponents() 
        }) 
       } 
     } 

     } catch { 
      print("something went wrong") 
     } 

    }) 

    task.resume() 

} 

這些行顯示的錯誤:
讓TICKET_NUMBER = pvds_ticket_number [行] [ 「TICKET_NUMBER」]作爲!字符串
讓customer_name = pvds_ticket_number [row] [「customer_name」] as!字符串

+0

你有沒有檢查這個http://stackoverflow.com/search?q=%5Bswift%5DType+Any+has+no+subscript+members –

+1

沒有[這53個結果](http://stackoverflow.com/搜索?tab = votes&q =%5bswift3%5d%20Any%20has%20no%20subscript%20members)搜索「Any any no subscript members」有幫助嗎? – Moritz

回答

0

pvds_ticket_number看起來被指定爲NSArray<Any>。當你訪問它時,你會像NSArray<[String: String]>那樣對待它。

問題的第一行是:let ticket_number = pvds_ticket_number[row]["ticket_number"] as! String。編譯器知道pvds_ticket_number是一個數組,所以使用[row]工作得很好。但編譯器不知道索引row中的類型或對象,因此它認爲它是Any。由於編譯器正確地告訴你,Any類型沒有下標方法。

解決這個問題的最簡單方法是給編譯器更多關於你的pvds_ticket_number數組的信息。目前,當你爲它分配使用:

self.pvds_ticket_number = results as! [Any] as NSArray

首先,除非你特別需要的東西從NSArrayArray沒有考慮使用Array。在這種情況下,上述線路將成爲更多的東西一樣:

self.pvds_ticket_number = results as! [[String: String]]

這是假設你的數組是字典與鍵字符串和值兩個數組,你可能需要該位基礎上改變這些字典實際上是由什麼構成的。

+0

我更正了我的代碼以使用[String:String]。不過,我現在正在使用'模糊引用來記住下標'這些行,我得到了以前的錯誤。 – smstarr

+0

某處您聲明'pvds_ticket_number'作爲變量。我猜它被定義爲'NSArray'而不是'[String:String]'。如果有疑問,請將此線分成多行,以便更好地瞭解問題的實際位置。 – theMikeSwan

+0

它被聲明爲var pvds_ticket_number = [String:String]() – smstarr

-1

如果我是你,我會使用swiftyjson可可豆莢。我曾經與類似的問題鬥爭,似乎不管我學到多少東西,他們總是會出現。 Swiftyjson非常輕巧易用,因此您無需花費數小時就可以累積技術債務,試圖找出一個簡單的解決方案。

+0

謝謝,我會檢查出來。 對於像我這樣只參與其中的人來說,因爲我試圖爲工作制作一個簡單的應用程序很困難。 – smstarr