2

我已经构建了一组 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!
}

这是错误消息:

Cannot invoke 'encode' with an argument list of type '(Codable)'

我尝试将类型从 Codable 更改为 Encodable 但得到相同的错误,除了消息中的类型 (Encodable)。有什么建议吗?我的回退是在当前 ViewController 中编码数据,然后调用 HTTPPost 函数,然后在 VC 中解码。但这真的很笨拙。

4

1 回答 1

7

您需要将具体类型传递给JSONEncoder.encode,因此您需要使用类型约束使您的函数泛型Encodable(Codable不需要,它太严格了)。

func encodeRequestJSON<T:Encodable>(apiRequestObject: T) throws -> Data {
    return try JSONEncoder().encode(apiRequestObject)
}
于 2018-11-13T16:17:29.573 回答