投掷函数类型'(数据)抛出的转换无效 - > ()'到非投掷功能类型'(数据) - > ()'

时间:2017-09-21 08:09:31

标签: ios swift

我为它创建了一个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

1 个答案:

答案 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)"
}
相关问题