我的 API 请求代码产生了一个我无法调试或理解的错误

My API request code produces a bug I can't debug or understand

我不确定该代码中的问题所在

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()
            }
        }
    } 

我希望它创建一个事件类型的对象数组,但它产生了这个错误:

Thread 1: EXC_BREAKPOINT (code=1, subcode=0x102ca0f4c

您的代码出现 SwiftJSON API 错误。罪魁祸首是行

jsonObject as! Events

如果您实际上是使用 as? 动态向下转换运算符以安全的方式编写代码,编译器会很乐意向您指出类型 EventsjsonObject 的类型是不同类型层次结构的部分,因此向下转换总是会失败。

根据 SwiftJSON 文档,可以在 https://github.com/SwiftyJSON/SwiftyJSON 找到该框架确实管理反序列化,但是它的基本 API 不提供任何对象填充工具,因此这是程序员的任务。

比如说,Events 类型有 2 个存储属性,let string: Stringlet int: Int。 为了从已解析的 JSON 对象中创建 Events 对象,您需要手动提取值

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

然后你应该将这些值传递给你自己的 custom-written 构造函数

let events = Events(string, int)

只有在这一点之后,您才会真正拥有一个可以使用的事件对象。

编辑:自从 Swift 4 发布以来,还有一个 Codable 协议和一个 JSONDecoder 类型,它们提供了强大、灵活和 type-safe 的设施解码由 Data 对象表示的 json 有效载荷,你应该放弃 SwiftyJSON 因为它是一个不必要的依赖项。

首先,我们鼓励您放弃 SwiftyJSON 而选择 Codable

发生错误是因为 (Swifty)JSON 对象无法转换为自定义结构或 class。

您必须将 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
   }
}

如果您实际上根本不需要索引,请不要使用基于索引的循环。从 JSON 对象创建一个 Event 实例并附加它

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: [=12=]) }