gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:06:20 26 4
gpt4 key购买 nike

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com