使用 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。使用GTLRDriveServiceexecuteQuery 方法执行查询。此方法采用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

有人可以为 Google Drive REST API v3 提供最新的 Android 指南吗?

google drive simple upload rest API的示例