2017-05-04 58 views
0

我真的不确定为什么JSON解析会导致SIGABRT错误。Playground执行错误:解析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

回答

2

此行似乎是一个问题:

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

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

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

+0

好的,你认为我应该做些什么改变才能解决这个问题? –

+0

我会为您的枚举添加一个构造函数,它接受一个字符串并返回一个正确创建的枚举值。然后你可以调用类似'self.state = Bug.State(fromString:dict [“state”])' –

+0

虽然我不认为这是个问题。所有这三个self.xxx语句都会导致此错误。 –