gpt4 book ai didi

swift - 为什么我可以将 Codable 与 Swift 3.3 的项目语言版本一起使用?

转载 作者:行者123 更新时间:2023-12-01 07:34:56 25 4
gpt4 key购买 nike

Codable 在 Swift 4 中引入。我的项目语言版本是 Swift 3.3,但我仍然可以在我的项目中使用 Codable。这不是问题,但这怎么可能呢?我只是想知道。

最佳答案

Swift 编译器版本和“Swift 语言版本”build设置(对应于
-swift-version 命令行标志)是两个不同的东西。前者是您正在使用的编译器和标准库的实际版本,而后者只是一个标志,告诉编译器尝试模仿以前 Swift 版本的行为。这样可以提供更顺畅的迁移体验——您可以更新到最新的 Swift 编译器,而无需立即更新您的代码库以适应语言的最新变化。

在您的情况下,听起来您使用的是 Swift 4.1 编译器,“Swift 语言版本”设置为 Swift 3.3。这被称为“Swift 3 兼容模式”。请注意,Swift 3.3 版本是一个伪版本——它的存在仅代表在 Swift 3 兼容模式下运行的 Swift 4.1 编译器。

这是一个方便的表格(信息取自 SE-0212 ),它根据兼容模式将编译器映射到语言版本:

enter image description here

(请注意,现在 SE-0212 已实现,此兼容模式的版本升级将不再适用于 Swift 5 及更高版本)

所以这意味着您正在使用 Swift 4.1 标准库(其中包括新的 Codable 协议(protocol))并使用 Swift 4.1 编译器(其中包括 Codable 必要的编译器魔法)进行编译 综合)。这就是您仍然可以利用新的 Codable 协议(protocol)的原因。

但是,通过在 Swift 3 兼容模式下运行,您是在指示编译器模仿 Swift 3 编译器的行为。例如,这将导致它允许您访问标记为 @available(swift, obsoleted: 4) 的声明,阻止您访问标记为 @available(swift, introduced: 4) 的声明,忽略 #if swift(>=4) 条件编译 block 中的代码,否则会尽力保持与 Swift 3 的源代码兼容性。

后者并不总能完美实现,例如使用 Swift 3.1 编译器编译:

protocol P {}
typealias X = protocol<P, AnyObject>
class C : X {}

但它无法使用以 Swift 3 兼容模式 (SR-8153) 运行的 Swift 4.1 编译器进行编译。

如果 DecodableEncodable 协议(protocol)被标记为 @available(swift, introduced: 4),那么你确实不会能够以 Swift 3 兼容模式访问它们。但是没有真正的理由将它们标记为这样,因为没有真正的理由阻止人们在 Swift 3 模式下利用它们,因为 Swift 4 编译器完全支持它们。

但是,由于 Swift 3 兼容模式只是一种源代码兼容性的临时模式,因此您无法在未来的编译器版本中永远使用它。它will no longer be an option in the Swift 5 compiler (但是,您将拥有 Swift 4 的兼容模式)。因此,您需要确保在某个时候将代码库更新到 Swift 4,以便能够顺利迁移到 Swift 5 编译器。

最后,值得注意的是一个新的 compiler 指令(可以在条件编译 block 中使用)is being introduced in Swift 4.2 .不同于 #if swift(...) 检查由 -swift-version 提供的语言版本,#if compiler(...) 将检查编译器的实际版本,忽略它可能运行的任何兼容模式。

关于swift - 为什么我可以将 Codable 与 Swift 3.3 的项目语言版本一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51281693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com