Мой код запроса API выдает ошибку, которую я не могу отладить или понять - PullRequest
0 голосов
/ 28 мая 2019

Я не уверен, где определить проблему в этом коде

var events = [Events]()

    let URL_GET_DATA = "http://192.168.100.4/PrototypeWebService/api/getevents.php"

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        Alamofire.request(URL_GET_DATA).responseJSON{ response in
            if let json = response.result.value {
                print(json)
                let swiftvar = JSON(json).array
                for i in 0..<(swiftvar?.count)! {
                    let jsonObject = swiftvar?[i].object
                    self.events.append(jsonObject as! Events)
                }
                self.EventTable.reloadData()
            }
        }
    } 

Я ожидаю, что он создаст массив объектов типа Events, но выдает эту ошибку:

Тема 1: EXC_BREAKPOINT (код = 1, субкод = 0x102ca0f4c

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Прежде всего, вам предлагается сбросить SwiftyJSON в пользу Codable.

Ошибка возникает из-за того, что (Swifty) объект JSON не может быть приведен к пользовательской структуре или классу.

Необходимо передать значение JSON инициализатору пользовательской структуры.

struct Event { // it's highly recommended to name this kind of object in singular form
   let varA : String
   let varB : Int

   init(json: JSON) {
      self.varA = json["varA"].string ?? ""
      self.varB = json["varB"].int ?? 0
   }
}

И, пожалуйста, никогда не используйте циклы, основанные на индексах, если вам вообще не нужен индекс.Создайте экземпляр Event из объекта JSON и добавьте его

guard let swiftvar = JSON(json).array else { return }
for item in swiftvar {
     let event = Event(json: item)
     self.events.append(event)
}

или еще проще

guard let swiftvar = JSON(json).array else { return }
self.events = swiftvar.map{ Event(json: $0) } 
0 голосов
/ 28 мая 2019

Ваш код неправильно использует SwiftJSON API.Виновником является строка

jsonObject as! Events

Если бы вы действительно писали код безопасным способом, используя динамический оператор понижения as?, компилятор с радостью объявил бы вам, что тип Events и тип jsonObject являются частями отдельных иерархий типов, и, следовательно, обратное преобразование всегда завершится неудачей.

Согласно документации SwiftJSON, которая может быть найдена на https://github.com/SwiftyJSON/SwiftyJSON, платформа управляет десериализацией, однако ее базовый API не предоставляет никакихобъекты населенных пунктов и, следовательно, это задача программистов.

Скажем, тип Events имеет 2 сохраненных свойства, let string: String и let int: Int.Чтобы создать Events объект из проанализированного JSON-объекта, вам нужно извлечь значения вручную как таковые

let string = jsonObject["name"].string
let int = jsonObject["int"].int

, а затем передать эти значения в свой собственный конструктор, написанный как таковой

let events = Events(string, int)

Только после этого у вас фактически будет объект «События», который вы можете использовать.

Редактировать: также с момента выхода Swift 4 существует протокол Codable и JSONDecoder type, который предоставляет надежные, гибкие и безопасные для типов средства для декодирования ваших полезных нагрузок json, представленных Data объектом, и вам, вероятно, следует отказаться от SwiftyJSON, потому что это ненужная зависимость.

...