【问题标题】:iOS QuickStart for Google Sheets API fails after converting to Swift 3转换为 Swift 3 后,适用于 Google Sheets API 的 iOS 快速入门失败
【发布时间】:2016-09-26 06:14:59
【问题描述】:

适用于 Google 表格 API 的 iOS 快速入门: https://developers.google.com/sheets/quickstart/ios?ver=swift

在 Xcode 8 中,该代码适用于 Swift 2,但无法从 GTLRSheets_ValueRange 获取工作表的值。

重现问题:

  1. 按照说明创建项目、pod,然后复制粘贴代码。

  2. 在项目 Build Settings 中开启“Use Legacy Swift Language Version” - 设置“Yes”并在菜单 Edit/Convert 中选择“To Current Swift Syntax...”

  3. 验证应用是否正常运行。

  4. 在项目 Build Settings 中关闭“Use Legacy Swift Language Version” - 设置“No”并在菜单 Edit/Convert 中选择“To Current Swift Syntax...”

  5. 应用转换更改

  6. 验证应用启动,授权谷歌账号并调用“displayResultWithTicket”方法。

预期结果:

下面的指令用结果对象中的值填充变量“rows”

"让 rows = result.values!"

实际结果:

下面的指令抛出错误

"result.values"

但以下说明提供了预期值:

result.range
result.majorDimension 

我可以看到结果中的值(在内部结构中)。

同样的例子在 Android 中运行良好。

UPD:添加了带有错误和观察变量的图像:

到目前为止,在这段代码中发现的 Swift 2 和 3 版本之间的唯一区别 - 字段“values”是从 Objective-C 从“NSArray *values”转换为“[[AnyObject]]?” (在 Swift 2 中)和“[[Any]]?” (在 Swift 3 中):SE-0116

UPD-2:指令中的错误点。似乎与以下操作有关。我测试了之前报告的错误 - 它们没有被复制。

Swift._arrayForceCast <A, B> (Swift.Array<A>) -> Swift.Array<B>

【问题讨论】:

  • 我也在尝试使用这个谷歌的例子,我得到了同样的错误。你想清楚了吗?
  • 不,我为这个项目回滚到 Swift 2。我在 Google 的跟踪器上注册了一个勾号,并在 Apple 的开发者论坛上发布了这个问题 - 到目前为止没有任何反馈。

标签: ios swift3 xcode8 google-sheets-api


【解决方案1】:

转换原始 JSON 值似乎可以解决这个错误

guard let rows = result.jsonValue(forKey: "values") as? [[String]] else
{
    // Shouldn't happen, but handle error case just in case
}

// Use rows: [[String]]

【讨论】:

  • 为我工作。非常感谢!
【解决方案2】:

也许这个博客Converting between Result, Optionals, and Swift 2 errors 可能会有所帮助。它讨论了处理错误的可能方法。 Swift 2 引入了一种新的错误处理模型,其中函数可以抛出错误,调用者可以捕获它们。这取代了桥接 Objective-C 类中的NSError。基于此GitHub thread,您可以在操作可能失败时使用Result

【讨论】:

  • 谢谢。框架看起来不错。我阅读了您引用的文章,但没有找到解决此特定问题的方法。
猜你喜欢
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 2018-07-26
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
相关资源
最近更新 更多