Swift 4.1 ABI前向兼容性:实现Apple将来将实现的功能

时间:2018-08-23 12:47:19

标签: ios swift

我不在乎明年是否要重新编译我的应用程序,因为苹果再次更改了Swift语言。

但是,我要关心的是,由于用户已更新到下一个iOS版本,因此我的一个应用程序已经在应用程序商店中停止运行,并且在加载期间崩溃。我来自Objective C背景,但我不了解二进制级别的Swift应用程序中正在发生什么。

在我正在编写的应用程序中,我添加了一个函数,该函数允许我添加两个CGPoint值。这样做是有道理的,例如使用pan gesture recognizers时。代码是:

func +(_ a: CGPoint, _ b: CGPoint) -> CGPoint {
    return CGPoint(x: a.x+b.x, y: a.y+b.y)
}

问题是:如果Apple将来决定也为+添加CGPoint函数,是否会破坏我的应用程序? (我不在乎是否必须删除此功能并重新编译,我只在乎是否已部署的应用程序在iOS更新后突然中断。)

系统:具有Xcode 9.4,Swift 4.1,部署目标iOS 9.0的macOS 10.13.6

1 个答案:

答案 0 :(得分:4)

  

如果苹果将来决定他们也为CGPoint添加+功能,是否会破坏我的应用程序?

不。首先。应用程序当前随附了用于系统框架的Swift叠加层。如果/以后在ABI稳定后会发生变化,则除非重新编译现有应用,否则它们不会受到影响。

第二,重载解析发生在编译时。即编译器选择要调用的具体函数,并且没有动态链接会对其进行更改。


如果您使CGPoint符合诸如BinaryInteger之类的现有协议(其要求中包含+运算符),则情况会有所不同,因为协议要求可以动态分派。 (让CGPointBinaryInteger可能没有意义,但是为了争论,请忍受。)

在这种情况下,将来版本中添加的与Apple的一致性冲突可能会导致冲突。

Swift论坛上正在进行有关Swift应该如何处理最后一个问题Retroactive Conformances vs. Swift-in-the-OS的讨论。