我已经构建了一组 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)
}
关于json - Swift 4 - 无法使用类型为 'encode' 的参数列表调用 '(Codable)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53285100/