Playground执行错误:解析JSON字符串时发出SIGABRT信号

时间:2017-05-04 19:32:54

标签: 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 = 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
}

错误图片:enter image description here

1 个答案:

答案 0 :(得分:2)

这一行似乎有问题:

NoMethodDefinedException

self.state = dict["state"] as! Bug.StateBug.State的自定义类型。但enum中的值为dict["state"]。通过使用String,您告诉编译器您知道在运行时将是as!,但是当系统在应用程序运行时看起来它发现它是一个Bug.State的字符串,因此会引发异常。

类似地,在设置时间戳的行上,您尝试使用直接类型转换将可能的字符串转换为日期。您将不得不使用NSDateFormatter从字符串中提取日期以将该值转换为String。