2016-09-19 3 views
2

Я пытаюсь преобразовать свой проект в Swift 3 и продолжать получать эту ошибку. Я исправил все другие ошибки, кроме этого. Я видел, что у нескольких других людей были проблемы, но я новичок в JSON, поэтому я их не понимал. Любая помощь будет принята с благодарностью.Тип 'Any' не имеет подписчиков в Swift 3 Xcode 8

Вот мой код:

class func fetchPriceForSymbol(_ symbol: String, completion:@escaping (_ stock: StockPrice) ->()) { 

    DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default).async { 

     let url = URL(string: "http://finance.yahoo.com/webservice/v1/symbols/\(symbol)/quote?format=json") 
     let data = try? Data(contentsOf: url!) 

     do { 
      //let object = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) 
      let object = try! JSONSerialization.jsonObject(with: data!) 
      if let dictionary = object as? [String: AnyObject] { 
       let title = object["list"] as! NSDictionary 
       let title2 = title["resources"] as AnyObject! 
       let title3 = title2[0] as AnyObject! 
       let title4 = title3["resource"] as AnyObject! 
       let fields = title4["fields"] as AnyObject! 


       let stockPrice = StockPrice (
        price: fields["price"] as AnyObject! as! String 
       ) 

       DispatchQueue.main.async { 
        completion(stock: stockPrice) 
       } 
      } 
     } catch { 
      // Handle Error 
     } 



    } 
} 
+0

Можете вы добавить дерево данных JSON? Трудно сказать, как выглядит ваше дерево, просто глядя на ваш код. – eshirima

+3

Вы используете 'object' после необязательной привязки, где он не указан (' Any'). Замените 'object' на' dictionary'. И используйте '[String: Any]', а не 'NSDictionary'. И превратить объекты в нечто более значимое, чем «AnyObject». – vadian

+0

Укажите словарь, выполнив это let object = try! JSONSerialization.jsonObject (с: data!) Как? NSDictionary – AdamM

ответ

5

Попробуйте это в разделе разборе в середине:

 let parsed = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:Any] 
     let list = parsed["list"] as! [String:Any]? 
     let resources = list?["resources"] as! [AnyObject]? 
     let fields = resources?[0] as! [String:Any]? 
     let resource = fields?["resource"] as! [String:Any]? 
     let fields2 = resource?["fields"] as! [String:Any]? 
     let price = fields2?["price"] as! String? 
-1

Вы можете попытаться изменить

if let dictionary = object as? [String: AnyObject] 

с

if let dictionary = object as? NSDictionary 
+4

** Не делайте этого **. Это делает хуже, и это не решает проблему. – vadian

Смежные вопросы