Mar*_*ski 2 json swift codable encodable
我建立了一组API函数,这些函数对一个对象进行编码(使用Struct符合的Codable),然后将生成的JSON Data对象发布到服务器,然后对JSON响应进行解码。一切正常-对Swift 4.2中的JSON解析新方法特别满意。但是,现在我想重构代码,以便可以将代码重用于各种方法调用-当我这样做时,我会得到一个非常烦人的错误。
func encodeRequestJSON(apiRequestObject: Codable) -> Data {
do {
let encoder = JSONEncoder()
let jsonData = try encoder.encode(apiRequestObject)
let jsonString = String(data: jsonData, encoding: .utf8)
print(jsonString)
} catch {
print("Unexpected error")
}
return jsonData!
}
Run Code Online (Sandbox Code Playgroud)
这是错误消息:
Cannot invoke 'encode' with an argument list of type '(Codable)'
Run Code Online (Sandbox Code Playgroud)
我尝试将类型从Codable更改为Encodable,但是除了消息中的类型为(Encodable)以外,发生了相同的错误。有什么建议吗?我的后备方法是在当前ViewController中对数据进行编码,然后调用HTTPPost函数,然后在VC中进行解码。但这确实很笨拙。
您需要将一个具体的类型传递给JSONEncoder.encode,因此您需要使您的函数具有类型约束为通用Encodable(Codable不需要,它的约束过于严格)。
func encodeRequestJSON<T:Encodable>(apiRequestObject: T) throws -> Data {
return try JSONEncoder().encode(apiRequestObject)
}
Run Code Online (Sandbox Code Playgroud)