我构建了一组API函数,这些函数对对象进行编码(使用符合Codable
的Struct
(,然后将生成的JSON数据对象发布到服务器,然后对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!
}
这是错误消息:
Cannot invoke 'encode' with an argument list of type '(Codable)'
我已经尝试将类型从Codable更改为Encodable,但得到了相同的错误,除了消息中的类型(Encodable(。有什么建议吗?我的后顾之忧是在当前的ViewController中对数据进行编码,然后调用HTTPPost函数,然后在VC中进行解码。但这真的很麻烦。
您需要一个具体的类型传递到JSONEncoder.encode
中,因此您需要使函数具有对Encodable
的类型约束的泛型(不需要Codable
,它的限制性太强(。
func encodeRequestJSON<T:Encodable>(apiRequestObject: T) throws -> Data {
return try JSONEncoder().encode(apiRequestObject)
}