我在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代码之上的某种扩展或层?
答案 0 :(得分:0)
您可以指定一个包含Google执行方法的扩展程序,获取泛型并转换为块中的泛型类型。这基本上只是你已经做过的相当抽象,但对于所有类型,你的扩展都将被设计为覆盖。