2016-10-03 7 views
2

Я был в этом сейчас на несколько дней.
Я просто пытаюсь преобразовать свой проект из Swift 2 в Swift 3, и я исправил довольно много ошибок.
Тем не менее, я дошел до последних 19, все из которых являются той же ошибкой.
В принципе, у меня есть запрос на сервер, который возвращает объект JSON.
Этот объект JSON имеет вложенные объекты в его сторону.
Я искал Google и читал несколько часов, пытаясь разузнать и, к сожалению, ничего не сработало.
Любая помощь приветствуется.
(Примечание: меня спрашивали по предыдущим вопросам, чтобы опубликовать то, что я уже пробовал.
Я не собираюсь этого делать, потому что я испробовал много разных способов исправить эту проблему)Swift: Преобразование из Swift 2 в Swift 3 Неудача

Ошибка: введите «Любой», нет ни одного члена подстрочных

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
    if let data = response["data"] as? NSArray { 
     for (index, item) in data.enumerated() { 
      let id = item["id"] as! String 
     } 
    } 
} 

Здесь пока несколько вещей, которые я пытался:

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
    if let data = response["data"] as? NSArray { 
     for (index, item):[String:AnyObject] in data.enumerated() { 
      let id = item["id"] as! String 
     } 
    } 
} 

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
    if let data = response["data"] as? NSArray { 
     for (index, item) in data.enumerated() as? NSArray { 
      let id = item["id"] as! String 
     } 
    } 
} 

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
    if let data = response["data"] as? NSArray { 
     for item in data as? NSArray { 
      let id = item["id"] as! String 
     } 
    } 
} 

ни один из указанных выше исправила проблему. Вот SOF вопросы я упоминаться:

  1. type any? has no subscript members
  2. Facebook SDK error for subscript members
  3. Type 'Any' has no subscript members (firebase)
  4. Type 'Any' Has no Subscript Members in xcode 8 Swift 3
  5. Type 'Any' has no subscript members after updating to Swift 3

Любая помощь очень ценится!

+0

Не бросайте вещи как 'NSArray'. Используйте быстрые типы и передавайте их как '[[[String: String]]]' или что бы это ни было. – dan

+0

Покажите JSON, по крайней мере, до 10 символов после '' data ': '. – vadian

ответ

1

Хорошо, так что после того, как некоторые help from 0ndre_, вот как я исправил проблему. К сожалению, это не было полным исправлением для многомерных/вложенных объектов, поэтому мне пришлось изменить свой API, который вызывает приложение.

if let response = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary { 
    if let data = response["data"] as? [AnyObject] { 
     for (index, item) in data.enumerated() { 
      let id = item["id"] as! String 
     } 
    } 
} 
1

Привет Вы можете попробовать это:

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary { 
    if let data = response["data"] as? [AnyObject] { 
     for (index, item) { 
      if let id = item["id"] as! String{ 
       print(id) 
      } 
     } 
    } 
} 

или

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

    if let parseJson = json {    
    if let data = parseJson["data"] as? [AnyObject] {     
    for signleArray in data {     
      if let customObjects = signleArray as? [AnyObject] {     
      for customObject in customObjects {     
       let userId = customObject["id"] as! String 
       } 
      } 
      } 
     } 
     } 

Просто дайте мне знать, как это работает, так что мы можем понять это :)

+0

Ни один из этих вариантов не работал, но спасибо за попытку. Мне может потребоваться реализовать SwiftJSON, которого я надеялся не делать. Мне не нравится полагаться на сторонние модули. – recoilnetworks

1

Вы не должны отбрасывать в NSArray, но [AnyObject]. При перечислении NSArray в Swift 3 это id item type maps to Any, которое действительно не имеет индекса. Вы найдете дополнительную информацию об Any vs AnyObjectin the standard library documentation, а также обоснование для этого изменения Swift 3 для обработки id как Any vs AnyObject поясняется in this Swift evolution proposal.

 let inputData:Data = "{\"data\": [{\"id\":\"x\"},{\"id\":\"y\"},{\"id\":\"z\"}]}".data(using: .utf8)! 

     if let response = try JSONSerialization.jsonObject(with: inputData, options: []) as? [String:AnyObject], 
     let responseData = response["data"] as? [AnyObject] 
     { 
      for (index, item) in responseData.enumerated() 
      { 
       let id = item["id"] as! String 
       print(id) 
      } 
     } 

Что касается использования 3-библиотек, таких как SwiftyJSON для JSON синтаксического анализа, вы не можешь, как 3-й модулей сторонних, но ваш код выше будет врезаться на плохом входе (если элемент не имеет ключ «идентификатора» или, если это не строка).Это, конечно, не так, как библиотеки, такие как SwiftyJSON или Freddy, - единственный способ написать надежный JSON-код синтаксического анализа в Swift, но предоставленные средства Cocoa, конечно же, не используют систему Swift в интересах программиста, и легко успокаиваться плохо ввод с этим API, тем сложнее задача синтаксического анализа (которая, по всей вероятности, не должна действительно приводить к сбою вашей программы, но должна сообщаться как ошибка).

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