Situation
- I have a two generic classes which will fetch data either from api and database, lets say APIDataSource<I, O> and DBDataSource<I, O> respectively 
- I will inject any of two class in view-model when creating it and view-model will use that class to fetch data it needed. I want view-model to work exactly same with both class. So I don't want different generic constraints for the classes - // sudo code - ViewModel(APIDataSource <InputModel, ResponseModel>(...)) - // I want to change the datasource in future like - ViewModel(DBDataSource <InputModel, ResponseModel>(...)) 
- To fetch data from api ResponseModel need to confirms to "Decodable" because I want to create that object from JSON. To fetch data from realm database it need to inherit from Object 
- Inside ViewModel I want to get response like - // sudo code - self.dataSource.request("param1", "param2") 
- If developer tries to fetch api data from database or vice-versa it will check for correct type and throws proper error. 
Stripped out version of code for playground
Following is stripped out version of code which shows what I want to achieve or where I am stuck (casting un-constrained generic type to generic type that confirms to Decodable)
import Foundation 
// Just to test functions below
class DummyModel: Decodable {
}
// Stripped out version of function which will convert json to object of type T
func decode<T:Decodable>(_ type: T.Type){
    print(type)
}
// This doesn't give compilation error
// Ignore the inp
func testDecode<T:Decodable> (_ inp: T) {
    decode(T.self)
}
// This gives compilation error
// Ignore the inp
func testDecode2<T>(_ inp: T){
    if(T.self is Decodable){
        // ??????????
        // How can we cast T at runtime after checking T confirms to Decodable??
        decode(T.self as! Decodable.Type)
    }
}
testDecode(DummyModel())
Any help or explanation that this could not work would be appreciated. Thanks in advance :)
 
     
    