我一直在尝试弄清楚如何通过我正在编程的 Swift 应用程序将文件从 iOS 上传到 Google Drive。我对 Swift 和 Objective-C 非常陌生,但出于我正在开发的应用程序的目的,它必须在 Swift 中完成。我按照 Google Drive API 教程在我的应用程序中进行了设置,并且我能够成功登录并列出我的 Google Drive 文件夹中的文件,如 this tutorial 中所述。 .
自从开始工作以来,我一直在尝试将文件从 iOS 上传到 Google 云端硬盘。由于 Google Drive API 文档上没有 Swift 代码向我展示如何执行此操作,因此我尝试严格遵循此 Objective-C 代码 listed here用于基本上传。
我当前的代码如下:
let fileData: Data? = FileManager.default.contents(atPath: "files/photo.jpg")
let metadata = GTLRDrive_File.init()
metadata.name = "photo.jpg"
let uploadParameters = GTLRUploadParameters(data: fileData!, mimeType: "image/jpeg")
uploadParameters.shouldUploadWithSingleRequest = true
let query = GTLRDriveQuery_FilesCreate.query(withObject: metadata, uploadParameters: uploadParameters)
query.fields = "id"
self.service.executeQuery(query, completionHandler: (GTLRServiceTicket, Any?, Error?) -> Void) {
return {
(ticket: GTLRServiceTicket, object: Any?, error: Error?) -> Void in
}
}
我发现了另一篇 SO 帖子,试图通过查看类型别名来解决与此有点类似的问题。当我提取 GTLRServiceCompletionHandler 的类型别名时,我得到的是:
public typealias GTLRServiceCompletionHandler = (GTLRServiceTicket, Any?, Error?) -> Swift.Void
这是显示的 service.executeQuery 的默认函数签名:
service.executeQuery(query: GTLRQueryProtocol, completionHandler: GTLRServiceCompletionHandler?)
在运行代码之前我遇到的当前编译器错误表明,completionHandler 的参数标签与任何可用的重载方法不匹配。我已经在这方面工作了很长时间(而且对 Swift 不太熟悉),所以我不完全确定我能做些什么来让它继续工作。任何帮助将不胜感激。
最佳答案
您可能误解了 completionHandler
的目的,或者对此类调用的语法有困难。您提供一个将在查询完成时执行的闭包。它接受三个类型为 (GTLRServiceTicket, Any?, Error?)
的参数,并且不返回任何内容 (Void
)。
您还可以使用尾随闭包语法,这意味着您不需要标记 completionHandler
参数。
把它们放在一起,你会得到类似的东西
self.service.executeQuery(query) { (ticket:GTLRServiceTicket, object:Any?, error:Error?) in
// Put your completion code here
}
关于ios - 由于 GTLRServiceCompletionHandler,无法为 Google Drive REST API 运行 service.executeQuery(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45334952/