【问题标题】:Playground Execution error: Signal SIGABRT while parsing JSON stringPlayground 执行错误:解析 JSON 字符串时发出 SIGABRT 信号
【发布时间】:2017-05-04 19:32:54
【问题描述】:

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

错误图片:

【问题讨论】:

    标签: json swift xcode swift3


    【解决方案1】:

    这一行似乎有问题:

    self.state = dict["state"] as! Bug.State

    Bug.Stateenum 的自定义类型。但是dict["state"] 中的值是String。通过使用as!,你告诉编译器你知道在运行时这将是一个Bug.State,但是当系统在应用程序运行时查看它发现它是一个字符串,它是不是Bug.State,所以它会引发异常。

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

    【讨论】:

    • 好的,你认为我应该做些什么改变来解决这个问题?
    • 我会在你的枚举中添加一个构造函数,它接受一个字符串并返回一个正确创建的枚举值。然后你可以打电话给self.state = Bug.State(fromString: dict["state"])
    • 我认为这不是问题所在。所有三个 self.xxx 语句都会导致此错误。
    • 中间的,设置评论,应该没问题。最后一个表明您对类型转换运算符的工作方式有类似的误解
    猜你喜欢
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2011-12-16
    • 2022-09-27
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    相关资源
    最近更新 更多