【问题标题】:Is there a way to conditionally compile for Swift 1.1 and 1.2?有没有办法为 Swift 1.1 和 1.2 有条件地编译?
【发布时间】:2015-06-08 20:35:50
【问题描述】:

在 Swift 1.2 (Xcode 6.3) 中 malloc() 的定义明显改变了

在 Swift 1.2 中它被定义为

func malloc(_: Int) -> UnsafeMutablePointer<Void>

在 Swift 1.1 (Xcode 6.2) 中它被定义为:

在 Xcode 6.2 中

func malloc(_: UInt) -> UnsafeMutablePointer<Void>

这意味着使用此函数的代码必须根据您使用的 Xcode 版本进行更改。我一直在 Xcode 6.2 和当前的 Xcode 6.3 beta 之间来回切换,每次都必须编辑我的代码非常烦人。

是否有 #if 语句和某种环境变量的组合可以让我的代码根据 Xcode/Swift 的版本进行调整? (这可能是 Swift 1.2 和 1.1 的区别)

【问题讨论】:

  • 我不认为有条件为 Swift 1.1 或 1.2 编译的方法。在您的具体情况下,let mem = malloc(size_t(numBytes)) 应该可以工作。
  • 同上@MartinR 所说的。从某种意义上说,没有“需要”有条件地为 Swift 1.1 和 1.2 进行编译,因为每个人都只能通过其中一个将生产代码部署到 App Store ——现在是 1.1,因为另一个是 beta 版,之后是 1.2因为一旦发布,它将部署到与 1.1 相同的 OS/SDK 目标。
  • (在其他意义上,使用新语言的 beta 版本无疑是一种痛苦,而缓解这种痛苦的方法对request from Apple 来说是件好事,尤其是如果你有具体的建议。)
  • 使用 size_t 作为参数的类型是票证。 @rickster,您可以将其发布为答案以便我接受吗?

标签: swift


【解决方案1】:

(来自我上面的评论:) 我认为没有办法为 Swift 1.1 或 1.2 有条件地编译。在你的具体情况下

let mem = malloc(size_t(numBytes))

应该可以。

size_t 在 Swift 1.0/1.1 中定义为 UInt,在 Swift 1.2 中定义为 Int。通过显式转换,您可以使其同时编译。

【讨论】:

  • @DuncanC:不客气! – 但是 Swift 1.1/1.2 之间还有其他可能更难以解决的差异,例如 countElements()count()
  • 我会从那座桥上掉下来。现在我的直接问题已经解决了。
  • 是否有来自 Apple 的 Swift 语言指南 iBook 用于 Swift 1.2,以及对更改的连贯描述?
  • @DuncanC:没有适用于 Swift 1.2 的 iBook(据我所知)。 Xcode 6.3 beta 发行说明中描述了这些更改(可在developer.apple.com/xcode/downloads 上获得)。 Swift 博客里也有东西(developer.apple.com/swift/blog
  • 目前没有适用于 Swift 1.2 的 iBook,因为 1.2 是测试版。我想当 1.2 是最终版本时会有一本 iBook。但是你可以在 developer.apple.com 上查看相同内容的网页版,它甚至有一个 revision history 告诉你本书的哪些部分已更改以解决 Swift 1.2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
相关资源
最近更新 更多