通过应用建议的变更,Swift 4至Swift 5
我目前正在将Swift 4升级到Swift 5,Xcode建议进行以下更改。然而,我想知道这是否会影响我在Swift 4中实现的任何逻辑通过应用建议的变更,Swift 4至Swift 5,swift,Swift,我目前正在将Swift 4升级到Swift 5,Xcode建议进行以下更改。然而,我想知道这是否会影响我在Swift 4中实现的任何逻辑 extension JSONDecoder { static let convertFromSnakeCaseDecoder: JSONDecoder = { let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase retu
extension JSONDecoder {
static let convertFromSnakeCaseDecoder: JSONDecoder = {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
return decoder
}()
}
struct CustomError: Codable {
let errors: [String]
}
private func decodeCustomError(data: Data, statusCode: Int) -> CustomError? {
if let errorData = try? JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data) as CustomError? {
if let errorData = errorData {
return formCustomError(jsonError)
}
return formCustomError(parsingError)
} else if let errorMessage = State(rawValue: statusCode) {
return formCustomError(errorMessage)
} else {
return formCustomError(genericError)
}
}
Swift 4(当前实施)
Swift 5(建议更改)
我可以安全地假设它们是相同的吗?一个类型转换根本不需要,在Swift 5中,可能的双选项是扁平的
if let customError = try? JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data) {
}
但是,强烈建议始终处理(至少打印
)潜在错误
do {
let customError = try JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data)
// do something with the error
} catch { print(error) }
编辑:
使用do-catch
块的decodeCustomError
方法是
private func decodeCustomError(data: Data, statusCode: Int) -> CustomError {
do {
return try JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data)
} catch {
if let errorMessage = State(rawValue: statusCode) {
return formCustomError(errorMessage)
} else {
return formCustomError(error) // assuming `formCustomError` accepts an `Error` argument
}
}
}
原始代码对我来说很奇怪,为什么需要演员阵容?@JoakimDanielson我已经将丢失的部分添加到代码中。我很想听听你有价值的建议?非常感谢你提供了详细的答案和建议。我添加了缺失的部分,以便让您更好地了解我在哪里挣扎。我已经添加了缺少的方法
decodeCustomError
,我想知道我如何才能像你建议的那样加入到do catch
语句中,因为我还有其他几种情况。请查看编辑需要删除{
,对吗?让customError=尝试jsondeconder.convertfromsnakecaseductor.decode(CustomError.self,from:data){
是的,重新加载页面,您可以直接返回
解码对象。不清楚formCustomError
实际上是什么,但不是formCustomError(genericError)
返回解析错误(catch
块中的隐式error
实例)或者按不同的顺序退货。
do {
let customError = try JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data)
// do something with the error
} catch { print(error) }
private func decodeCustomError(data: Data, statusCode: Int) -> CustomError {
do {
return try JSONDecoder.convertFromSnakeCaseDecoder.decode(CustomError.self, from: data)
} catch {
if let errorMessage = State(rawValue: statusCode) {
return formCustomError(errorMessage)
} else {
return formCustomError(error) // assuming `formCustomError` accepts an `Error` argument
}
}
}