我为它创建了一个JSON解析器和错误类:
enum ParseError: Error {
case cannotParseField(fieldName: String)
case cannotFormatDate(fieldName: String)
case cannotFormatEnum(fieldName: String)
}
class SPUserParser {
static func parseSPUsers(data:Data) throws -> [SPUser] {
var spUsers:[SPUser] = []
let json = JSON(data: data)
if let array = json["value"].array {
for user in array {
guard let id = user["Id"].int else { throw ParseError.cannotParseField(fieldName: "Id") }
//PARSE OTHER STUFF...
}
}
return spUsers
}
}
然后当我尝试使用我的解析器时:
sendQuery(requestMethod: "GET", url: requestUrl, body: "", includeFormDigest:false, completed: { (data:Data) in
var result = ""
do {
let newUsers:[SPUser] = try SPUserParser.parseSPUsers(data: data)
self.spUsers.removeAll()
self.spUsers.append(contentsOf: newUsers)
}
catch ParseError.cannotParseField(let fieldName) {
result = "cannotParseField: \(fieldName)"
}
catch ParseError.cannotFormatDate(let fieldName) {
result = "cannotFormatDate: \(fieldName)"
}
catch ParseError.cannotFormatEnum(let fieldName) {
result = "cannotFormatEnum: \(fieldName)"
}
print(result)
项目不会编译。
错误是:Invalid conversion from throwing function of type '(Data) throws -> ()' to non-throwing function type '(Data) -> ()'
要修复此错误,我必须在此三次捕获后添加catch {}
。为什么我要这样做?
我的代码基于Apple文档:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html
答案 0 :(得分:0)
如何简化代码可以在catch中使用let关键字:
do {
try SPUserParser.parseSPUsers(data: data)
// Your Stuff
} catch let parseError as ParseError {
result = handle(parseError)
} catch {
// Handles other kinds of errors
result = "other kind of error: \(error)"
}
在我使用的handle方法中,你检查它是哪种ParseError,基本上只是一个开关,然后相应地处理它
func handle(_ parseError: ParseError)
switch parseError {
case .cannotParseField(let fieldName):
return "cannotParseField: \(fieldName)"
case .cannotFormatDate(let fieldName):
return "cannotFormatDate: \(fieldName)"
case .cannotFormatEnum(let fieldName):
return "cannotFormatEnum: \(fieldName)"
}