我使用泛型在函数的调用站点动态分配响应应该是的值的类型。
如何设置泛型参数的默认值,以便没有人可以假设出现并在他们赢得一个对象时插入一个对象作为响应?
希望代码能说明问题并且比我更有意义。
其他信息:
在下面的方法中,如果是GET请求,我用json响应初始化T.如您所见,泛型必须符合QueryType协议,它只包含一个初始化程序,因此每个T对象都有一个初始化程序来以自己的方式处理响应。
func fireRequest<T: QueryType>(_ request: FirebaseRequest, completion: @escaping (_ data: [T]? = [], _ error: FirebaseError?) -> Void ) {
// setting default value to data param throws error.
}
成功的用例:
client.fireRequest(FirebaseRequest.observe(path: path), completion: { (data: [User], error: FirebaseError? ) in
// Since I infer 'T' to be of type User, i can expect a collection of users, or single user as my response. This is what I want.
})
错误用例:
client.fireRequest(FirebaseRequest.setValue(path: path, value: locationData), completion: { (_, error: FirebaseError? ) in
// error: generic parameter 'T' could not be inferred.
// In this case, I am posting some data to database, so I dont expect a response, but putting underscore throws error.
})
答案 0 :(得分:0)
我不确定您在问什么,但您可以使用T()
为该类型生成defualt值。
至于下划线,因为(_, FirebaseError?)->Void
与([T], FirebaseError?)->Void
的类型不同。所以你的关闭应该是
{(_:[AnyObject]?, error: FirebaseError?) in code }
如果您希望使用泛型,则需要定义一些函数,如
func errorCaseCompletetion<T>( _ : [T]?, error: FirebaseError?){
//code
}
然后你只需将函数名称作为完成块传递。