swift - 类型“响应”不符合协议“可解码”\“可编码”
问题描述
class ErrorObj: NSObject,Codable {
var numError:Int = 0
var DescriptionError = ""
}
class Response<T: Codable>: NSObject, Codable {
var error:ErrorObj!
var result:T!
func getResponse(errorObj:(ErrorObj)->Void,sucssesObj:(T)->Void) {
if error.numError != 0 {
errorObj(error)
} else{
sucssesObj(result)
}
}
}
错误:
无法自动合成“Decodable”,因为“T?” 不符合 'Decodable' 协议需要初始化器 'init(from:)' 类型为 'Decodable'
无法自动合成“Decodable”,因为“T?” 不符合 'Encodable' 协议需要初始化器 'init(from:)' 类型为 'Encodable'
解决方案
该问题是由于您将两个属性声明Response
为隐式展开的选项 (IOU) 造成的。编译器无法自动生成Codable
IOU 属性所需的方法。
但是,无论如何都没有必要制作这些借据。如果它们是响应中始终存在的必需属性,请将它们设为非可选。如果它们可能丢失,请制作它们Optional
(使用?
而不是!
)。
此外,Swift 不是 Objective-C。没有必要让你的类型继承自NSObject
. 除非您明确需要引用类型行为,否则您还应该使用struct
s 而不是es。class
您还应该使所有属性不可变,除非您明确需要能够改变它们。
struct ErrorObj: Codable {
let numError: Int
let description: String
}
struct Response<T: Codable>: Codable {
let error: ErrorObj
let result: T
func getResponse(errorObj: (ErrorObj) -> Void, successObj: (T) -> Void) {
if error.numError != 0 {
errorObj(error)
} else{
successObj(result)
}
}
}
推荐阅读
- npm - 如何使用 react-swipeable-views 解决 shadow-cljs 的 NPM 依赖问题?
- c++ - 检查数组中的字符对
- json - MongoDB - 如何查询和聚合嵌套文档值
- javascript - data.sort 未定义或 data.sort 不是函数
- angular - 角度 PUT 请求未达到快速代码
- vue.js - 如何在父子关系中使用 vee-validate
- javascript - Instanbul JS、Vue JS、Vue CLI、Cypress e2e 测试和 Typescript 的覆盖率报告仅显示几个文件
- azure - 在 AzureChina 中使用 Packer 构建映像时出现错误 400
- sql-server - 如何停止呈现带有可选参数的 SSRS 报告
- jquery - ajax调用后需要根据下拉过滤器更新工具提示值