簡體   English   中英

如何在Swift中的函數中為通用參數返回默認值?

[英]How to return a default value for a generic parameter in a function in Swift?

我正在使用泛型在函數的調用位置動態分配響應應為的值的類型。

  • 下面的函數是FirebaseClient類擁有的唯一可訪問方法。
  • 它在許多不同的地方都被稱為。
  • 為了確保正確的對象位於響應中,我在函數的調用位置插入了期望的對象。 這里是要抓住的地方。 如果我要向數據庫發布一個值,我不希望有任何響應,只關心錯誤,但是即使我知道在這種情況下它都為零,也被迫為參數/參數添加任意類型。

我如何為通用參數設置默認值,以使沒有人假設不會出現並在沒有對象時插入對象作為響應?

希望代碼能說明一切,並且比我有更多的道理。

其他資訊:

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

})

我不確定您要問的是什么,但可以使用T()生成該類型的默認值。

至於下划線,是因為(_, FirebaseError?)->Void([T], FirebaseError?)->Void 所以你應該關閉

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

如果要使用泛型,則需要定義一些函數,例如

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

然后,您只需傳遞函數名稱作為完成塊即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM