Json 声明符合协议的泛型类型常量

Json 声明符合协议的泛型类型常量,json,swift,swift4,codable,Json,Swift,Swift4,Codable,好的,通过使用新的可解码协议编写一些网络代码来修补Swift 4。以下错误与几个编译器错误一起出现: // A lot has been stripped out of this for brevity, so we can focus on this specific constant struct APIRequest { let decoder = JSONDecoder() let decodableType: <T.Type where T : Decodable

好的,通过使用新的可解码协议编写一些网络代码来修补Swift 4。以下错误与几个编译器错误一起出现:

// A lot has been stripped out of this for brevity, so we can focus on this specific constant
struct APIRequest {
    let decoder = JSONDecoder()
    let decodableType: <T.Type where T : Decodable>    // Compiler errors here

    // This function compiles and runs successfully when I pass it in explicitly (by removing the above constant)
    func decodeJsonData<T>(_ data: Data, for type: T.Type) throws -> T where T : Decodable {
        return try decoder.decode(type, from: data)
    }
}
//为了简洁起见,我们从中删去了很多内容,因此我们可以将重点放在这个特定常数上
结构API请求{
let decoder=JSONDecoder()
让decodableType://编译器错误出现在此处
//当我显式传入此函数时(通过删除上述常量),此函数将编译并成功运行
func decodeJsonData(data:data,对于类型:T.type)抛出->T,其中T:Decodable{
返回try decoder.decode(类型,发件人:数据)
}
}
decodableType应该是符合可解码协议的任何结构/类的“类型”(即User.self,其中User符合可解码或可编码)。我如何告诉编译器这一点

编辑:换句话说,我想这样写代码

struct APIRequest {
    let decoder = JSONDecoder()
    let decodableType: <T.Type where T : Decodable>    // Not sure how to declare this type

    func decodeJsonData(_ data: Data,) throws -> Decodable {
        return try decoder.decode(decodableType, from: data)
    }
}
struct-apirest{
let decoder=JSONDecoder()
让decodableType://不确定如何声明此类型
func decodeJsonData(u-data:data,)抛出->可解码{
返回try decoder.decode(decodableType,from:data)
}
}

这意味着在结构上的常量中保存第一个代码块中的泛型参数。我只是不知道如何在Swift中正确写出类型。

如果您希望结构具有泛型类型,则必须将其声明为泛型类型,而不是像您尝试的那样声明为成员:

struct APIRequest<T: Decodable> {
    let decoder = JSONDecoder()

    func decodeJSONData(from data: Data) throws -> T {
        return try decoder.decode(T.self, from: data)
    }
}
struct-apirest{
let decoder=JSONDecoder()
func decodeJSONData(来自数据:data)抛出->T{
返回try decoder.decode(T.self,from:data)
}
}
或者,您可以将泛型类型限制在函数的范围内:

struct APIRequest {
    let decoder = JSONDecoder()

    func decode<T: Decodable>(from data: Data) throws -> T {
        return try decoder.decode(T.self, from: data)
    }
}
struct-apirest{
let decoder=JSONDecoder()
func解码(来自数据:data)抛出->T{
返回try decoder.decode(T.self,from:data)
}
}

如果希望结构具有泛型类型,则必须将其声明为泛型类型,而不是像您尝试的那样声明为成员:

struct APIRequest<T: Decodable> {
    let decoder = JSONDecoder()

    func decodeJSONData(from data: Data) throws -> T {
        return try decoder.decode(T.self, from: data)
    }
}
struct-apirest{
let decoder=JSONDecoder()
func decodeJSONData(来自数据:data)抛出->T{
返回try decoder.decode(T.self,from:data)
}
}
或者,您可以将泛型类型限制在函数的范围内:

struct APIRequest {
    let decoder = JSONDecoder()

    func decode<T: Decodable>(from data: Data) throws -> T {
        return try decoder.decode(T.self, from: data)
    }
}
struct-apirest{
let decoder=JSONDecoder()
func解码(来自数据:data)抛出->T{
返回try decoder.decode(T.self,from:data)
}
}

这对我没有帮助,因为我不想让结构符合泛型类型(它不打算这样做)。我只想存储符合Decodable的类的类型,这样我就可以在将其返回给调用方之前通过解码器。我想我在最初的问题中可能有点不清楚,很抱歉。我添加了一个编辑来澄清(希望)问题的意图。这个答案几乎肯定是正确的。“因为我不希望结构符合泛型类型。”此结构不符合泛型类型。它只是被它参数化了。“我只想存储符合Decodable的类的类型,这样我就可以传递它。”对类型进行参数化(正如这个答案所做的)会准确地存储该类型,以便将其传递回去。您设想的调用代码是什么,而这个答案没有解决。获取您描述的常数是可能的,但在您的示例中通常是无用的。啊,‘由它参数化’对我来说是个神奇的词,我不确定为什么我第一次看到它时不理解它(除了我刚刚开始理解泛型力学这一事实)。这个回答/评论加上这个文档:最终使我在理解上超过了极限。@Msencenb我回答了你的问题吗?这对我没有帮助,因为我不想让结构符合泛型类型(它不是有意的)。我只想存储符合Decodable的类的类型,这样我就可以在将其返回给调用方之前通过解码器。我想我在最初的问题中可能有点不清楚,很抱歉。我添加了一个编辑来澄清(希望)问题的意图。这个答案几乎肯定是正确的。“因为我不希望结构符合泛型类型。”此结构不符合泛型类型。它只是被它参数化了。“我只想存储符合Decodable的类的类型,这样我就可以传递它。”对类型进行参数化(正如这个答案所做的)会准确地存储该类型,以便将其传递回去。您设想的调用代码是什么,而这个答案没有解决。获取您描述的常数是可能的,但在您的示例中通常是无用的。啊,‘由它参数化’对我来说是个神奇的词,我不确定为什么我第一次看到它时不理解它(除了我刚刚开始理解泛型力学这一事实)。这个回答/评论加上这个文档:最终使我在理解上超过了极限。@Msencenb我回答了你的问题吗?“这意味着持有第一个代码块的泛型参数“什么第一个代码块?正确…”。。。我所说的“第一个代码块”是指本页上的第一个灰色代码区域。第一个代码块中的泛型参数是传入的“for type”参数。“这意味着保留第一个代码块中的泛型参数”什么第一个代码块?正确。。。我所说的“第一个代码块”是指本页上的第一个灰色代码区域。第一个代码块中的泛型参数是传入的“for type”参数。