我的 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?
动态向下转换运算符以安全的方式编写代码,编译器会很乐意向您指出类型 Events
和 jsonObject
的类型是不同类型层次结构的部分,因此向下转换总是会失败。
根据 SwiftJSON 文档,可以在 https://github.com/SwiftyJSON/SwiftyJSON 找到该框架确实管理反序列化,但是它的基本 API 不提供任何对象填充工具,因此这是程序员的任务。
比如说,Events
类型有 2 个存储属性,let string: String
和 let 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=]) }
我不确定该代码中的问题所在
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?
动态向下转换运算符以安全的方式编写代码,编译器会很乐意向您指出类型 Events
和 jsonObject
的类型是不同类型层次结构的部分,因此向下转换总是会失败。
根据 SwiftJSON 文档,可以在 https://github.com/SwiftyJSON/SwiftyJSON 找到该框架确实管理反序列化,但是它的基本 API 不提供任何对象填充工具,因此这是程序员的任务。
比如说,Events
类型有 2 个存储属性,let string: String
和 let 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=]) }