通过应用建议的变更,Swift 4至Swift 5

通过应用建议的变更,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

我目前正在将Swift 4升级到Swift 5,Xcode建议进行以下更改。然而,我想知道这是否会影响我在Swift 4中实现的任何逻辑

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
       }
   }
}