使用Google Drive REST API

时间:2017-03-24 19:29:50

标签: swift3 google-drive-api downcast completionhandler

我在Swift 3应用中使用Google Drive REST API。使用executeQuery的{​​{1}}方法执行查询。此方法采用类型为GTLRDriveService的完成块,该块又声明为

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以外的任何类型,则代码不会编译。

在Objective C中,可以使用特定于查询的类型指定完成块。例如(改编自here):

Any?

有没有办法避免这种沮丧? (我是出于无知而提出的问题;我对Swift来说有点新手。)如果我正在编写自己的图书馆,我会设计不同的方法签名,但这是Google'图书馆,我有点坚持他们提供的东西。也许是Google代码之上的某种扩展或层?

1 个答案:

答案 0 :(得分:0)

您可以指定一个包含Google执行方法的扩展程序,获取泛型并转换为块中的泛型类型。这基本上只是你已经做过的相当抽象,但对于所有类型,你的扩展都将被设计为覆盖。