0

在引用 PerfectLib 的更新版本时,我在让我的 PerfectServer 模块(称为 MCPushServer)在 Ubuntu 上编译时遇到问题。至于我之前的问题,我已经更新了 PerfectLib 以利用 WebRequest 的惰性 var 参数 postBodyString 来访问 JSON 正文数据。这在 Mac 上一切正常,但是当我将新文件复制到 Linux VM 并重新编译项目时,MCPushServer 中的 RegistrationHandler 无法编译,因为它无法识别 WebRequest 中的参数:

编译器的输出:

  • MCPushServer/MCUnregistrationHandler.swift:33:28: error: value of type 'WebRequest' has no member 'postBodyString' let bodyData = request.postBodyString

详细步骤如下:

  • 将 PerfectLib 复制到我的远程服务器上
  • 删除预先存在的 PerfectLib.so
  • 运行“make”:PerfectLib.so 被重新创建,它包含对“postBodyString”的引用(grep 文件并返回匹配项)
  • 运行 'sudo make install' 链接到 /user/local/lib/ > 一切正常
  • 重新编译 PerfectServer
  • cd 进入 Examples/MCPushServer 并运行 make: 出现上述错误

我还尝试注释掉 WebRequest 中的现有方法(例如:lazy var params)并重复该过程:我本来希望我的 Handler 抱怨 WebRequest 中缺少的成员,但它似乎可以应付,好像什么都没发生一样。

在我看来,好像在某个地方有一个过时的 PerfectLib / WebRequest 接口,我的模块在尝试构建时引用了该接口。有人能在这里指出我正确的方向吗?

4

1 回答 1

0

对我自己的问题发表长篇回应,以防它可以帮助其他人将他们的 XCode 开发代码移植到 Linux。

我假设我的模块在引用上述成员时由于某种缓存生成的接口而无法编译是完全错误的。

问题在于我使用 Ubuntu 的 Swift 2.2 官方版本:它不包含(正在进行的)Swift Foundation 库。在 OS X 上开发时,这不是问题,因为我相信最新的 XCode 附带一个基本的 Swift Foundation 库,并且无论如何它可以编译 Objective-C Foundation 库中定义的任何类型。

安装当前的 Swift 3.0 发行版和编译器解决了这个问题。

我最好的猜测是 postBodyString 的实现引用了一些需要 Objective-C 或 Swift 基础库的 Foundation API。我本来希望 WebRequest 一开始就不会编译,而不是公开被指控方法的接口,但这是一个谜,我将留给在这件事上有更多专业知识的人。

同样,这也解释了为什么在“JSONDictionaryType”上使用下标时出现错误:

> 类型 'JSONDictionaryType' 没有下标成员

JSONDictionaryType 类型别名为 Dictionary 但我再次错过了通过使其符合“SequenceType”来扩展基本类型的 Foundation 库,这是下标的先决条件。

于 2016-01-29T15:56:56.477 回答