我真的不确定为什么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 = 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
}
答案 0 :(得分:2)
这一行似乎有问题:
NoMethodDefinedException
self.state = dict["state"] as! Bug.State
是Bug.State
的自定义类型。但enum
中的值为dict["state"]
。通过使用String
,您告诉编译器您知道在运行时将是as!
,但是当系统在应用程序运行时看起来它发现它是不一个Bug.State
的字符串,因此会引发异常。
类似地,在设置时间戳的行上,您尝试使用直接类型转换将可能的字符串转换为日期。您将不得不使用NSDateFormatter从字符串中提取日期以将该值转换为String。