2017-06-09 59 views
0

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

回答

2

如果你想你的結構有一個泛型類型,它必須被宣佈爲這樣的,而不是作爲一個成員與你正在嘗試:

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的類的類型,所以我可以通過它。」在類型上進行參數化(正如這個答案所做的)完全存儲該類型以便將其傳回。你想象什麼調用代碼,這個答案沒有解決。獲得你描述的常量是可能的,但在你的例子中通常是無用的。 –