操场执行错误:解析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

我真的不知道为什么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
}

错误图像:

此行似乎有问题:

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语句都会导致此错误。中间一个设置注释应该可以。最后一个例子表明您对类型转换操作符的工作方式有类似的误解。我已经更新了我的答案,并提供了一些关于如何处理字符串到日期的转换的附加信息。