使用 Google Drive REST API 在 Swift 3 完成处理程序中避免向下转换
Posted
技术标签:
【中文标题】使用 Google Drive REST API 在 Swift 3 完成处理程序中避免向下转换【英文标题】:Avoiding downcasts in a Swift 3 completion handler with Google Drive REST API 【发布时间】:2017-03-24 19:29:49 【问题描述】:我在 Swift 3 应用程序中使用 Google Drive REST API。使用GTLRDriveService
的executeQuery
方法执行查询。此方法采用GTLRServiceCompletionHandler?
类型的完成块,它又被声明为
public typealias GTLRServiceCompletionHandler = (GTLRServiceTicket, Any?, Error?) -> Swift.Void
由于这个声明,第二个参数必须向下转换为块内的适当类型。例如:
let createPermissionQuery = GTLRDriveQuery_PermissionsCreate.query(
withObject: permission, fileId: toShare.id)
...
driveService.executeQuery(createPermissionQuery) (ticket, result, error) in
if (error == nil)
// need to downcast result to GTLRDrive_Permission
let permission = result as! GTLRDrive_Permission
...
第二个参数始终是特定类型,完全由传递给executeQuery
的特定查询决定。例如,如果传递GTLRDriveQuery_PermissionsCreate
的实例,那么第二个参数(如果查询成功)将始终是GTLRDrive_Permission
类型。但是,如果我尝试将result
声明为Any?
以外的任何类型,则代码将无法编译。
在 Objective C 中,可以使用特定于查询的类型来指定完成块。例如(改编自here):
GTLRDriveQuery_PermissionsCreate *createPermissionQuery =
[GTLRDriveQuery_PermissionsCreate queryWithObject:permission
fileId:fileId];
...
[driveService executeQuery:createPermissionQuery
completionHandler:^((GTLRServiceTicket *ticket,
GTLRDrive_Permission *permission,
NSError *error)
if (error == nil)
// work directly with permission
...
];
有什么办法可以避免这种沮丧吗? (我是出于无知而问的;我对 Swift 有点陌生。)如果我正在编写自己的库,我会以不同的方式设计方法签名,但这是谷歌的库,我有点坚持他们的供应。也许是 Google 代码之上的某种扩展或层?
【问题讨论】:
不是答案,但如果库妨碍了,可能值得考虑直接调用 http REST API 并解析生成的 JSON。迄今为止,我对 Google 库的体验(我承认,我没有尝试过 Swift)是它们对困难的东西(例如节流、重试、分页、可恢复上传)没有多大帮助,所以你需要编码无论如何你自己。 【参考方案1】:您也许可以指定一个扩展来包装 Google 执行方法,采用泛型并强制转换为块中的泛型类型。这基本上只是对您已经在做的事情的一个相当抽象,但是对于所有类型,您的扩展都将被设计为涵盖。
【讨论】:
以上是关于使用 Google Drive REST API 在 Swift 3 完成处理程序中避免向下转换的主要内容,如果未能解决你的问题,请参考以下文章
通过Google Drive REST API上传或创建包含内容的新文件?
如何将文件重命名为 google drive rest api?改造2
使用 Google Drive REST API 在 Swift 3 完成处理程序中避免向下转换
如何使用 GoogleDrive REST API 将大文件 (1 GB +) 上传到 Google Drive