大约一年前,如果您想在iOS开发中使用SWIFT4.2,就必须安装Xcode 10,这意味着您使用了iOS 12 SDK。作为应用程序部署的一部分,SWIFT4.2运行时将自动与应用程序二进制绑定。这意味着安装应用程序的用户基本上会下载Swift运行时的副本,从而使应用程序能够正常工作。
但是,ABI稳定性随Swift 5而来,如果您的部署目标是iOS 12.2,则不再需要绑定运行时,因为运行时现在是iOS版本的一部分。但是,如果您想支持iOS 10和iOS 11,那么这个Swift运行时仍然会与您的应用程序二进制绑定在一起,并且它的行为方式与上面描述的相同。
关于swift.org的文档也是如此:
部署回早期OS版本的应用程序内部将嵌入Swift运行时的副本。在与Swift运行时附带的OS版本上运行时,运行时将忽略运行时的这些副本--本质上是惰性的。
到目前一切尚好。如果在SWIFT5.0中使用Xcode 10.2,并将应用程序部署到较早的iOS版本中,则仍然会将SWIFT5.0运行时与其捆绑在一起。然后,如果您的应用程序运行在iOS 12上,应用程序将使用iOS提供的运行时,如果它运行在iOS 11上,它将使用绑定为应用程序二进制文件的运行时。现在第一个问题:这是一个正确的假设吗?
现在我们来看看SWIFT5.1和iOS 13,它们将在9月份发布。SWIFT5.1包括一些附加的运行时特性,例如不透明的结果类型,这需要SWIFT5.1运行时。
在WWDC 2019会话402“Swift中的新内容”中,发言者在讨论SWIFT5.1功能不透明结果类型(SE-0244)时提到,该功能只适用于新的OSes:
需要新的Swift运行时支持 可在macOS Catalina,iOS 13,tvOS 13,watchOS 6及更高版本上找到
这是我最困惑的地方。无论您是否支持较旧的iOS版本(例如,iOS 10 ),Swift运行时5.1都不会随应用程序一起提供,从而使它能够使用这些新的运行时特性,还是我只是不正确地理解这一点呢?
发布于 2021-02-26 02:25:33
现在第一个问题:这是一个正确的假设吗?
是的,这是正确的。
无论您是否支持较旧的iOS版本(例如,iOS 10 ),Swift运行时5.1都不会随应用程序一起提供,从而使它能够使用这些新的运行时特性,还是我只是不正确地理解这一点呢?
嵌入式运行时与操作系统中的运行时不完全相同。例如,操作系统中的运行时是紧密集成的:
通过在操作系统中,Swift运行库可以与操作系统的其他组件紧密集成,特别是Objective运行时和基金会框架。OS运行时库也可以合并到dyld共享缓存中,这样与共享缓存之外的dylib相比,它们具有最小的内存和加载时间开销。
来源:https://swift.org/blog/abi-stability-and-apple/
当然,嵌入式运行时不能紧密集成到旧系统中。嵌入式运行时只能支持它正在执行的当前系统上已经可能实现的功能。当您的应用程序运行在较旧的应用程序上时,需要更新系统的功能根本不存在。
请注意,对于ObjC来说,这从来没有不同过。如果一个类或一个方法只存在于某个OS版本开始,您仍然可以向后部署到旧的系统版本,但是您不能在那里使用这个类/方法,因为它根本不存在。
if (@available(iOS 13, *)) {
// Code requiring iOS 13
} else {
// Alternative code for older OS versions
}或者在Swift:
if #available(iOS 13, *) {
// Code requiring iOS 13
} else {
// Alternative code for older OS versions
}和ObjC一样,从现在开始,新的Swift功能只适用于新的OSes。只有在能够使这些特性也可用于较老的OSes时(无论这些特性是否提供了运行时或需要使用嵌入式的运行时),此特性也可以向后部署,尽管不一定是所有的方式。
例如,10.15在其捆绑运行时引入了一个新特性,然后也许这个特性也可以使用shim库提供给10.14和10.13,而不是10.12到10.9,然后这个特性将被标记为“需要macOS 10.13或更高版本”。
如果部署到10.15,则无需进行任何操作,因为10.15的运行时支持此特性。如果您部署到10.14或10.13,那么编译器将添加shim库(就像它将添加嵌入式运行时一样),在10.13和10.14上将使用此库中的代码,而在10.15和以后将使用运行时中的代码。如果您在10.13之前部署到系统,这是可以的,但是您不能在这些系统上使用这个特性。
当然,如果一个新特性甚至可以通过嵌入式运行时提供,那么它当然也可以使用一个shim库提供给所有随运行时一起提供的系统,而这些系统只是不支持这个特性,因为shim库可以使用与嵌入式运行时使用的相同代码。
即使是对旧系统来说,有时也能提供新的功能,这可以用页面上的最后一个问题来解释:
是否可以让运行时支持新的Swift特性向旧的OSes?进行反向部署? 可能会向后部署某些类型的运行时功能,可能会使用诸如在应用程序中嵌入“shim”运行时库等技术。然而,这并不总是可能的。成功地向后部署功能的能力从根本上受到旧操作系统中已提供的二进制构件的限制和现有缺陷的限制。核心小组将逐案审议正在审查的新建议的落后部署影响。
https://stackoverflow.com/questions/57648898
复制相似问题