ios - 如何在 Swift 函数中返回泛型参数的默认值?

标签 ios swift function generics arguments

我正在使用泛型在函数的调用点动态分配响应应该是的值的类型。

  • 下面的函数是我的 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/

相关文章:

swift - 为什么我在 Swift 中的用户警报代码没有按预期工作

ios - awakeFromNib 中的自定义循环进度 View

python - 用Python制作一个电子邮件函数

函数声明返回任何东西,也无效?

ios - 为什么“ self ”无法识别?

ios - Nib awakefromNib() 崩溃

iphone - 如何知道设备类型

swift - 在 Swift 中为启动屏幕设置文件所有者的目的是什么?

JavaScript:参数传递不适用于所有浏览器

ios - 如何对 UITableViewCell 宽度变化使用react?