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

问题描述:

好吧,用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) 
    } 
} 

的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) 
    } 
} 

这意味着保持从第一个代码块中的泛型参数恒定的内部的结构。我只是不知道如何在Swift中正确写出类型。

+0

? – Alexander

+0

正确...通过'第一代码块'我的意思是这个页面上的第一个灰色代码区域。第一个代码块中的泛型参数是传入的'for type'参数。 – Msencenb

如果你想你的结构有一个泛型类型,它必须被宣布为这样的,而不是作为一个成员与你正在尝试:

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

    func decodeJSONData(from data: Data) throws -> T { 
     return 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) 
    } 
} 
+0

这不会帮助我,因为我不希望结构符合泛型类型(它不打算)。我只是想存储符合Decodable的类的类型,所以我可以在将它传递给调用者之前通过解码器。 – Msencenb

+0

我想我可能在我原来的问题上有点不清楚,对此感到抱歉。我已经添加了一个编辑来澄清(希望)这个问题的意图。 – Msencenb

+1

这个答案几乎肯定是正确的。 “因为我不希望结构符合通用类型。”该结构不符合通用类型。它只是由它参数化。 “我只是想存储符合Decodable的类的类型,所以我可以通过它。”在类型上进行参数化(正如这个答案所做的)完全存储该类型以便将其传回。你想象什么调用代码,这个答案没有解决。获得你描述的常量是可能的,但在你的例子中通常是无用的。 –