我正在使用泛型在函数的调用点动态分配响应应该是的值的类型。
- 下面的函数是我的 FirebaseClient 类唯一可访问的方法。
- 它在许多不同的地方被调用。
- 为了确保正确的对象在响应中,我在函数的调用站点插入了我期望的对象。这是陷阱。如果我向数据库发布一个值,我不期望任何响应,只关心错误,但我被迫为参数/参数设置任意类型,即使我知道在这种情况下它会是 nil。
我如何为泛型参数设置一个默认值,这样当他们得不到一个对象时,假设没有人会出现并插入一个对象作为响应?
希望代码不言自明并且比我做的更有意义。
其他信息:
在下面的方法中,如果是 GET 请求,我会用 json 响应初始化 T。如您所见,泛型必须符合 QueryType 协议(protocol),它只包含一个初始化器,因此每个对象 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.
})
最佳答案
我不太确定你在问什么,但你可以使用 T()
来生成该类型的默认值。
至于下划线是因为 (_, FirebaseError?)->Void
和 ([T], FirebaseError?)->Void
不是同一个类型.所以你的闭包应该是
{(_:[AnyObject]?, error: FirebaseError?) in code }
如果你想让它使用泛型,你需要定义一些函数,比如
func errorCaseCompletetion<T>( _ : [T]?, error: FirebaseError?){
//code
}
然后您只需将函数名称作为完成 block 传递。
关于ios - 如何在 Swift 函数中返回泛型参数的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44992622/