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

时间:2017-07-09 03:09:24

标签: ios swift function generics arguments

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

  • 以下函数是我的FirebaseClient类唯一可访问的方法。
  • 在许多不同的地方召唤它。
  • 为了确保响应中有正确的对象,我在函数的调用站点插入了我期望的对象。这是捕获。如果我向数据库发布一个值,我不指望任何响应,只关心错误,但我被迫为param /参数设置一个任意类型,即使我知道这样的情况将是零。

如何设置泛型参数的默认值,以便没有人可以假设出现并在他们赢得一个对象时插入一个对象作为响应?

希望代码能说明问题并且比我更有意义。

其他信息:

在下面的方法中,如果是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. 

})

1 个答案:

答案 0 :(得分:0)

我不确定您在问什么,但您可以使用T()为该类型生成defualt值。

至于下划线,因为(_, FirebaseError?)->Void([T], FirebaseError?)->Void的类型不同。所以你的关闭应该是

{(_:[AnyObject]?, error: FirebaseError?) in code }

如果您希望使用泛型,则需要定义一些函数,如

func errorCaseCompletetion<T>( _ : [T]?, error: FirebaseError?){
     //code
 }

然后你只需将函数名称作为完成块传递。