操场执行错误:解析JSON字符串时发出信号SIGABRT
我真的不知道为什么JSON解析会导致SIGABRT错误操场执行错误:解析JSON字符串时发出信号SIGABRT,json,swift,xcode,swift3,Json,Swift,Xcode,Swift3,我真的不知道为什么JSON解析会导致SIGABRT错误 class Bug { enum State { case open case closed } let state: State let timestamp: Date let comment: String init(state: State, timestamp: Date, comment: String) { self.state
class Bug {
enum State {
case open
case closed
}
let state: State
let timestamp: Date
let comment: String
init(state: State, timestamp: Date, comment: String) {
self.state = state
self.timestamp = timestamp
self.comment = comment
}
init(jsonString: String) throws {
let dict = convertToDictionary(from: jsonString)
我认为这就是导致错误的原因,但我无法找出原因:
self.state = dict["state"] as! Bug.State
self.comment = dict["comment"] as! String
self.timestamp = dict["timestamp"] as! Date
}
}
JSON字符串到字典:
func convertToDictionary(from text: String) -> [String: Any] {
guard let data = text.data(using: .utf8) else { return [:] }
let anyResult: Any? = try? JSONSerialization.jsonObject(with: data, options: [])
return anyResult as? [String: Any] ?? [:]
}
enum TimeRange {
case pastDay
case pastWeek
case pastMonth
}
错误图像:此行似乎有问题:
self.state=dict[“state”]as!错误状态
Bug.State
是enum
的自定义类型。但是dict[“state”]
中的值是字符串。使用as
你告诉编译器你知道在运行时这将是一个Bug.State
,但是当系统在应用程序运行时查看时,发现它是一个字符串,而不是一个Bug.State
,因此它抛出一个异常
类似地,在设置时间戳的行中,您尝试使用直接类型转换将可能是字符串的内容转换为日期。您必须使用NSDateFormatter从字符串中提取日期,以将该值转换为字符串。这一行似乎有问题:
self.state=dict[“state”]as!错误状态
Bug.State
是enum
的自定义类型。但是dict[“state”]
中的值是字符串。使用as
你告诉编译器你知道在运行时这将是一个Bug.State
,但是当系统在应用程序运行时查看时,发现它是一个字符串,而不是一个Bug.State
,因此它抛出一个异常
类似地,在设置时间戳的行中,您尝试使用直接类型转换将可能是字符串的内容转换为日期。您必须使用NSDateFormatter从字符串中提取日期,以将该值转换为字符串。好的,您认为我应该做哪些更改才能解决此问题?我会向枚举中添加一个构造函数,该构造函数接受字符串并返回正确创建的枚举值。然后你可以调用类似于self.state=Bug.state(fromString:dict[“state”])
的东西,但我认为这不是问题所在。所有三个self.xxx语句都会导致此错误。中间一个设置注释应该可以。最后一个例子表明,您对类型转换操作符的工作方式也有类似的误解。我已经更新了我的答案,提供了一些关于如何处理字符串到日期的转换的附加信息。好的,为了解决这个问题,您认为我应该做哪些更改?我会向枚举中添加一个构造函数,该构造函数接受字符串并返回正确创建的枚举值。然后你可以调用类似于self.state=Bug.state(fromString:dict[“state”])
的东西,但我认为这不是问题所在。所有三个self.xxx语句都会导致此错误。中间一个设置注释应该可以。最后一个例子表明您对类型转换操作符的工作方式有类似的误解。我已经更新了我的答案,并提供了一些关于如何处理字符串到日期的转换的附加信息。