• 早在2018年9月,Apple公司的Swift 开发团队在官网更新了 “Swift 5.0 Release Process” ,主要介绍 Swift 5.0 的开发目标、发布流程和预估时间表。据介绍Swift5.0最大的目标是实现语言ABI的稳定性。 不久前,Swift...

    早在2018年9月,Apple公司的Swift 开发团队在官网更新了 “Swift 5.0 Release Process” ,主要介绍 Swift 5.0 的开发目标、发布流程和预估时间表。据介绍Swift5.0最大的目标是实现语言ABI的稳定性。

    不久前,Swift社区发布的Swift5.0,在历经众多版本之后,终于迎来ABI的稳定,引来众多iOS开发者欢呼,很多人对此深感好奇。究竟ABI的稳定对于Swift意味着什么呢?

     

    首先我们要搞清楚什么是ABI

    ABI (Application Binary Interface) 定义:“在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口。” 说白了就是Swift 二进制程序与系统或者其它程序交互时会调用的接口。

     

    以往ABI不稳定的版本,打包 Swift 程序时, 必须嵌入一个 Swift 标准库. 因为系统不知道开发者使用程序时用的 ABI 是哪个版本, 所以必须没办法在系统内部内置一套标准库.

    ABI不稳定还会让第三方 SDK 开发困难. 应用与第三方 SDK 使用的 ABI 版本如果不同就会出现问题, 例如说 Swift 2和 Swift 3打包出来的库就没办法互相调用.

     

    而现在ABI的稳定意味着:

     Apple会根据iOS操作系统创建不同的下载包. 不再需要Swift的库,APP尺寸会变小。而且,因为系统集成了Swift, 大家都用同一个Swift了, app启动时候也就不需要额外加载Swift, 所以在新的系统中会更加节省内存.

    另外,对开发者最友好的就是再也不需要“从入门到入门”,每个大版本更新就要重新学习,Swift的语法基本不会再有大的变动。这也是一众iOS开发欢呼的重要原因。

     

    同时,ABI的稳定意味着学习Swift的最佳时机已经到来,知名iOS开发者,流行开源框架作者李明杰老师为了帮助在职的iOS开发者更全面、系统的学习Swift,特意开设《从入门到精通Swift编程》线上课程,通过线上直播的形式授课,每节课都会提供高清录播视频,错过直播或者想复习的同学可以随时随地回看。

     

    课程试听:

     

    基本运算、流程控制、函数        时长:1:55:27

    字符、字符串、枚举、集合、闭包       时长:2:00:04

     

    视频及课件下载请联系管理员

     

    展开全文
  • 开发四年只会写业务代码,分布式高并发都不会还做程序员? Swift 5 发布了,这是一个重要里程碑。 此版本终于...

    Swift 5 发布了,这是一个重要里程碑。

    此版本终于迎来了 ABI 稳定,因此 Swift 运行时现在可以引入到 Apple 平台各类操作系统的不同版本中,包括 macOS、iOS、tvOS 与 watchOS。Swift 5 还引入了构建块的新功能,包括重新实现 String、在运行时对执行内存的独占访问与新数据类型,以及对动态可调用类型的支持。

    Swift 5 兼容 Swift 4、Swift 4.1 和 Swift 4.2,Xcode 10.2 中包含了一个代码迁移器,可以自动处理许多迁移需要用到的源码更改。

    语言更新

    稳定的 ABI 与二进制兼容性

    ABI 已经稳定,因此 Swift 库现在可以整合到每个 macOS、iOS、tvOS 和 watchOS 版本中,应用将更容易构建,并且体积更小,因为它们不必包含这些库。

    标准库更新

    Swift 5 中的标准库包括以下新特性:

    • 使用 UTF-8 编码重新实现的 String 可以产生更快的代码,之前我们已经报导过:Swift 5 将使用 UTF-8 作为首选字符串编码
    • 改进了对字符串中原生文本的支持
    • 标准库添加 Result 和 SIMD 矢量类型
    • 增强了字符串插值功能,为从数据构造文本提供了更多灵活性
    • 改进了 Dictionary 和 Set 的性能

    其它语言和编译器更新

    Swift 5 默认为调试和发布版本强制执行对内存的独占访问。此外 Swift 5 支持动态可调用类型,有助于提高与 Python、JavaScript 和 Ruby 等动态语言的互操作性。

    包管理器更新

    Swift 5 为 Swift Package Manager 带来了许多新功能,包括依赖镜像、特定于目标的构建设置、自定义部署目标与生成代码覆盖率数据的能力。此外,swift run 命令现在可以在 REPL 中导入库而无需构建可执行文件。

    详情查看发布公告

    下载:

    展开全文
  • 近日,苹果开发者博客更新了一篇关于Swift 5的文章,带来了Swift 5新特性的消息,其中最受开发期待的莫过于iOS 12.2将带来ABI 稳定性,这意味着基础库将植入系统中,不再包含在App中,应用程序的体积会更小,更多新...

    近日,苹果开发者博客更新了一篇关于Swift 5的文章,带来了Swift 5新特性的消息,其中最受开发期待的莫过于iOS 12.2将带来ABI 稳定性,这意味着基础库将植入系统中,不再包含在App中,应用程序的体积会更小,更多新功能请看下文。

    App瘦身

    新功能

    Swift应用程序不再包含用于Swift标准库和Swift SDK(运行iOS 12.2、watchOS 5.2和tvOS 12.2的设备的构建变体)的动态链接库。因此,在使用TestFlight进行测试时,或者为本地开减小应用程序体积时,Swift应用程序可以变得更小。

    要查看iOS 12.2和iOS 12.1(或更早版本)应用程序之间的文件大小差异,请将应用程序的部署目标设置为iOS 12.1或更早版本,将scheme设置为Generic iOS Device,然后创建应用程序压缩包。

    在构建好压缩包之后,从压缩包管理器中选择Distribution App,然后选择Development Distribution。确保在App Thinning下拉菜单中选择特定的设备,比如iPhone XS。这个过程完成后,在新创建的文件夹中打开App Thinning Size Report。iOS 12.2的体积会比iOS 12.1或更早版本的体积小。具体的大小差异取决于应用程序使用的框架的数量。

    Swift

    @dynamicCallable属性允许你调用命名的类型,就像使用简单的语法糖调用函数一样。主要的应用场景是动态语言互操作性。

    例如:

    @dynamicCallable struct ToyCallable {    func dynamicallyCall(withArguments: [Int]) {}    func dynamicallyCall(withKeywordArguments: KeyValuePairs\u0026lt;String, Int\u0026gt;) {}}let x = ToyCallable()x(1, 2, 3)// Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])`x(label: 1, 2)// Desugars to `x.dynamicallyCall(withKeywordArguments: [\u0026quot;label\u0026quot;: 1, \u0026quot;\u0026quot;: 2])`

    现在支持标识KeyPath(.self),一个引用其整个输入值的WritableKeyPath

    let id = \\Int.selfvar x = 2print(x[keyPath: id]) // Prints \u0026quot;2\u0026quot;x[keyPath: id] = 3print(x[keyPath: id]) // Prints \u0026quot;3\u0026quot;

    在Swift 5之前,你可以编写一个带有可变参数的枚举:

    enum X {    case foo(bar: Int...) }func baz() -\u0026gt; X {    return .foo(bar: 0, 1, 2, 3) } 

    现在如果这么做会出错。相反,现在参数改成了一个数组,并且需要显式传入数组:

    enum X {    case foo(bar: [Int]) } func baz() -\u0026gt; X {    return .foo(bar: [0, 1, 2, 3]) } 

    在Swift 5模式下,可以用?和Optional类型表达式来扁平化生成的Optional,而不是返回嵌套的Optional。

    如果类型T符合这些字面量初始化中的一个——例如ExpressibleByIntegerLiteral——并假设literal是一个字面量表达式,那么T(literal)就创建了一个T类型的字面量。

    例如,UInt64(0xffff_ffff_ffff_ffff)现在是有效的,而之前它们会导致默认整型字面量类型Int溢出。

    字符串插值的性能、清晰度和效率得到了改进。

    旧的_ExpressibleByStringInterpolation协议被移除,如果你的代码使用了这个协议,需要更新这些代码,你可以使用#if在Swift 4.2和Swift 5之间条件化代码。例如:

    #if compiler(\u0026lt;5)extension MyType: _ExpressibleByStringInterpolation { /*...*/ }#elseextension MyType: ExpressibleByStringInterpolation { /*...*/ }#endif 

    Swift标准库

    • DictionaryLiteral类型被重命为KeyValuePairs。

    • 与Objective-C代码桥接的Swift字符串现在会在适当的时候从CFStringGetCStringPtr返回一个非空值,而且从-UTF8String返回的指针与字符串的生命周期(而不是最里面的autorelease pool)相关联。正确的程序应该不会有任何问题,而且还会带来性能方面的提升。但是,它可能会导致以前未经测试的代码暴露出潜在的错误。

    • Sequence协议不再具有SubSequence关联类型。之前返回SubSequence的Sequence方法现在返回的是具体的类型。例如,suffix(_:)现在返回Array。

    使用SubSequence的Sequence扩展应该修改为使用具体的类型,或者修改为Collection的扩展(此时SubSequence仍然可用)。

    例如:

    extension Sequence {    func dropTwo() -\u0026gt; SubSequence {        return self.dropFirst(2)    }}

    变为:

    extension Sequence {    func dropTwo() -\u0026gt; DropFirstSequence\u0026lt;Self\u0026gt; {         return self.dropFirst(2)    }}

    或者:

    extension Collection {    func dropTwo() -\u0026gt; SubSequence {        return self.dropFirst(2)    }}
    • String结构的原生编码从UTF-16切换到UTF-8,这样提高了String.UTF8View的性能(相对于String.UTF16View)。

    Swift包管理器

    • 现在,在使用Swift 5 Package.swift工具版本时,可以声明一些常用的特定于目标的构建设置。新的设置也可以基于平台和构建配置进行条件化。构建设置支持Swift和C语言定义、C语言头文件搜索路径、链接库和链接框架。

    • 现在,在使用Swift 5 Package.swift工具版本时,可以为Apple平台自定义最低部署目标。如果程序包的任何依赖项指定的最小部署目标大于程序包自身的最低部署目标,就会抛出错误。

    • 新的依赖项镜像功能允许顶层包覆盖依赖项URL。

    可以使用以下命令设置镜像:

    $ swift package config set-mirror \\--package-url \u0026lt;original URL\u0026gt; --mirror-url \u0026lt;mirror URL\u0026gt;
    • swift test命令提供了–enable-code-coverage标志,它生成的代码覆盖率数据也适用于其他代码覆盖工具。生成的代码覆盖率数据放在//codecov目录中。

    • Swift 5不再支持Swift 3 Package.swift工具版本。Swift 3 Package.swift工具版本的软件包应该升级到更新的工具版本。

    • 针对较大的程序包的包管理器操作现在明显更快。

    • Swift包管理器提供了一个新的–disable-automatic-resolution标志,当Package.resolved条目与Package.swift清单文件中指定的依赖项版本不兼容时,该标志会强制包解析失败。在进行持续集成时,如果需要检查包的Package.resolved是否已过期,这项功能会非常有用。

    • swift run命令提供了一个新的——repl选项,它将启动Swift REPL,支持导入包的库目标。这样你就可以轻松地试用API,而无需构建调用该API的可执行文件。

    Swift编译器

    • 现在,对于优化(-O和-Osize)构建,默认情况下在运行时强制执行独占内存访问。违反排他性的程序将在运行时出现“overlapping access”诊断消息。你可以使用命令行标志禁用它:-enforce-exclusivity = unchecked,但这样做可能会导致未定义的行为。运行时违反排他性通常是由于同时访问类属性、全局变量(包括顶层代码中的变量)或通过转义闭包捕获的变量。

    • Swift 3模式已被删除。-swift-version标志支持的值为4、4.2和5。

    • 在Swift 5模式中,在迭代使用Objective-C声明或来自系统框架的枚举时需要处理未知的case——可能在将来添加的case,或者可能在Objective-C实现文件中私下定义的case。Objective-C允许在枚举中存储任意值,只要它们与底层类型匹配即可。可以使用新的@unknown来处理这些未知case,当然也可以使用普通的default来处理它们。

    如果你已在Objective-C中定义了自己的枚举,并且不需要客户端处理未知case,那么可以使用NS_CLOSED_ENUM宏而不是NS_ENUM。Swift编译器就会识别出来,不要求在迭代时提供默认case。

    在Swift 4和4.2模式下,你仍然可以使用@unknown。如果省略了它并传入了一个未知的值,程序将在运行时出错,这与Xcode 10.1中的Swift 4.2的行为是一样的。

    • 现在,默认参数打印在SourceKit生成的Swift模块接口中,而不只是使用占位符。

    • unowned和unowned(unsafe)变量现在支持Optional。

    已知问题

    • 如果引用了UIAccessibility的成员,Swift编译器会在进行到“Merge swiftmodule”这个构建步骤时崩溃。构建日志会包含这样一条消息:
    Cross-reference to module 'UIKit'... UIAccessibility... in an extension in module 'UIKit'... GuidedAccessError

    包含NS_ERROR_ENUM枚举的其他类型也可能出现这个问题,但UIAccessibility是最常见的。

    解决方法:使用“Swift Compiler - Code Generation”下的Whole Module编译模式选项重新构建,这是大多数发布配置的默认设置。

    • 为了减少Swift元数据占用的空间,Swift中定义的便捷初始化器现在只在调用Objective-C中定义的指定初始化器时提前分配对象。在大多数情况下,这对程序没有任何影响,但是如果从Objective-C调用便捷初始化器,就会释放+alloc初始分配的资源。对于不希望发生对象替换的初始化器用户来说,这可能是有问题的。例如,在使用initWithCoder:时,NSKeyedUnarchiver的实现可能会不正确,如果它调用了init(coder:)的Swift实现,并且对象图中包含了环。

    • 如果KeyPath字面量引用了在Objective-C中定义的属性或者在Swift中使用@objc和动态修饰符定义的属性,那么编译可能会失败,并抛出“unsupported relocation of local symbol ‘L_selector’”的错误,或者KeyPath可能无法在运行时生成正确的哈希值。

    解决方法:你可以自己定义非@objc包装器属性,指向这个KeyPath。生成的KeyPath与引用原始Objective-C属性的KeyPath不一样,但使用效果是一样的。

    • 某些项目可能会遇到编译时回归问题。

    • Swift命令行项目在启动时会崩溃,错误为“dyld: Library not loaded”。

    解决方法:添加用户自定义的构建设置SWIFT_FORCE_STATIC_LINK_STDLIB = YES。

    已解决的问题

    • 扩展绑定现在支持嵌套类型的扩展,这些类型本身是在扩展内定义的。之前可能会因为声明顺序问题而失败,出现“undeclared type”错误。

    • 在Swift 5模式下,返回Self的类方法不能再使用返回具体类类型(非final)的方法来覆盖。这类代码不是类型安全的,需要将它们改掉。

    例如:

    class Base {     class func factory() -\u0026gt; Self { /*...*/ }} class Derived: Base {    class override func factory() -\u0026gt; Derived { /*...*/ } } 
    • 在Swift 5模式下,现在明确禁止声明与嵌套类型同名的静态属性,而之前可以在泛型类型的扩展中进行这样的声明。

    例如:

    struct Foo\u0026lt;T\u0026gt; {}extension Foo {     struct i {}    // Error: Invalid redeclaration of 'i'.    // (Prior to Swift 5, this didn’t produce an error.)     static var i: Int { return 0 }}
    • 现在可以在子类中正确继承具有可变参数的指定初始化器。

    • 在Swift 5模式下,@autoclosure参数不能再被转发给另一个函数调用的@autoclosure参数。相反,你必须使用括号显式调用函数值。调用将被包含在一个隐式闭包中,保证了与Swift 4模式相同的行为。

    例如:

    func foo(_ fn: @autoclosure () -\u0026gt; Int) {}func bar(_ fn: @autoclosure () -\u0026gt; Int) {    foo(fn) // Incorrect, `fn` can’t be forwarded and has to be called.    foo(fn()) // OK} 
    • 现在完全支持复杂的递归类型定义,包括之前在运行时会导致死锁的类和泛型。

    • 在Swift 5模式下,在将Optional值转换为通用占位符类型时,编译器在展开值时会更加保守。这种转换结果现在更接近于非通用上下文中获得的结果。

    例如:

    func forceCast\u0026lt;U\u0026gt;(_ value: Any?, to type: U.Type) -\u0026gt; U {    return value as! U } let value: Any? = 42print(forceCast(value, to: Any.self))// Prints \u0026quot;Optional(42)\u0026quot;// (Prior to Swift 5, this would print \u0026quot;42\u0026quot;.)print(value as! Any)// Prints \u0026quot;Optional(42)\u0026quot;
    • 协议现在可以将符合类型限定为给定类的子类。支持两种等效形式:
    protocol MyView: UIView { /*...*/ }protocol MyView where Self: UIView { /*...*/ } 

    Swift 4.2接受了第二种形式,但还没有完全实现,在编译时或运行时偶尔会发生崩溃。

    • 在Swift 5模式下,当在自己的didSet或willSet observer中设置属性时,observer现在只在self上设置属性(不管是隐式的还是显式的)时才会避免被递归调用。

    例如:

    class Node {    var children = Node     var depth: Int = 0 {        didSet {             if depth \u0026lt; 0 {                // Won’t recursively call didSet, because this is setting depth on self.                 depth = 0            }             // Will call didSet for each of the children,            // as this isn’t setting the property on self.            // (Prior to Swift 5, this didn’t trigger property            // observers to be called again.)            for child in children {                 child.depth = depth + 1            }         }    }}
    • 如果你使用#sourceLocation将生成文件中的行映射回源代码,那么诊断信息将显示在源文件中而不是生成文件中。

    • 使用泛型类型别名作为@objc方法的参数或返回类型不会再生成无效的Objective-C标头。

    英文原文:
    https://developer.apple.com/documentation/xcode_release_notes/xcode_10_2_beta_release_notes/swift_5_release_notes_for_xcode_10_2_beta?language=objc

    更多内容,请关注前端之巅。

    \"\"

    展开全文
  • 百度智能云 云生态狂欢季 热门云产品1折起>>> 苹果在 2014 年发布了全新编程语言 Swift...

    苹果在 2014 年发布了全新编程语言 Swift,到目前为止已经发展到了 Swift 4.0 版本,而 Swift 5 也即将在 WWDC 2019 开发者大会上亮相。到底新版本将会有哪些值得关注的地方?我们可以听一下苹果 Swift 项目主管是怎么说的。

    080735_ubl0_2720166.png

    John Sundell 最新一期 Swift by Sundell 播客请来了苹果 Swift 项目主管 Ted Kremenek,后者是苹果语言和运行高级主管,负责监督 Swift 5 的发布。

    播客中,Kremenek 被问到了一些有关 Swift 编程语言的话题,包括苹果如何为 Swift 设计新的特性以及如何将创意编程可以发布的功能的整个过程,当然还有主角 Swift 5。

    Swift 5 的关注重点是开发者期待已久的 ABI(Application Binary Interfaces,应用二进制接口)稳定性,Kremenek 详细介绍了 ABI 稳定性如何最终实现以及需要对 Swift 进行哪些改进才能使其变得 ABI 稳定。

    有了 Swift 5,使用某一版本的 Swift 编译器创建的 app 将能够与使用其他版本构建的库进行交互,而这在目前是不行的。

    感兴趣的朋友可以了解一下。

    来自:MacX

    展开全文
  • 译:Swift ABI (一)

    2019-04-08 09:56:59
    翻译自Swift在Github上发布的Swift ABI Manifesto Swift 4中ABI不会稳定对我们到底有多大影响?ABI究竟是什么?它稳定了又会怎样?达到ABI稳定为什么很困难?有哪些技术细节问题要处理?Swift官方又是如何看待当前...
        

    翻译自Swift在Github上发布的Swift ABI Manifesto

    Swift 4中ABI不会稳定对我们到底有多大影响?ABI究竟是什么?它稳定了又会怎样?达到ABI稳定为什么很困难?有哪些技术细节问题要处理?Swift官方又是如何看待当前Swift发展方向的?Michael Ilseman对这个问题进行了详细的阐述。由于原文较长,11就分几部分陆续分享给大家。希望大家对这个我们平时不太会关注的领域有些了解。

    原文链接


    蓝图

    当前,Swift最重要的工作之一,就是在多个版本之间保持兼容性。而所谓的兼容性,则是要在源码以及二进制层次上,分别达到它们各自的目标。

    在源代码层次实现兼容,也就是让新版本的编译器可以编译老版本的Swift代码。这可以降低开发者在迁移到Swift新版本时的痛苦。没有源代码层次的兼容,用Swift编写的项目就很难得以传承,项目中所有的源代码和使用的程序库必须使用同一个版本的Swift语言。而提供了源代码层次的兼容性,程序库的作者就可以基于某个Swift版本只维护一套代码,并且让程序库的使用者使用更新版本的Swift。

    程序库和运行时在二进制上的兼容性则让(用某个版本编译的)程序库在多个不同的Swift版本上进行分发成为可能。二进制的程序库包含了一个Swift module file,它提供了这个程序库API源代码级别的信息;以及一个共享的程序库文件,它包含了在运行时加载的编译之后的代码。因此,实现二进制的兼容性需要完成两目标:

    首先,Swift module格式的稳定性可以让编译器用固定的方式表达程序库的公共接口,这也就是Swift module file的稳定性。这包括了API的声明以及代码是否可以inline的表达方式。编译器需要使用module file完成诸多必要的工作,例如,当编译程序库的客户端调用时,对其进行类型检查以及生成调用代码。

    其次,ABI的稳定性则为使用不同版本Swift编译的程序库和应用程序提供了兼容性。这是这份文档接下来的部分关注的内容。这份文档探索并解释了什么是Swift ABI,并罗列了宣称Swift ABI已稳定前要进行的调查以及完成的目标。作为Swift社区的一份资源,这份文档也为Swift ABI的发展指明了方向。

    这份文档中,会用"SR-xxxx"的形式,引用Swift issue tracking system中的内容。这些内容记录了和Swift ABI相关的工程和设计任务。

    什么是ABI?

    在运行时,通过Swift编写的二进制程序通过ABI和其他的程序库或组件进行交互。ABI是Application Binary Interface的缩写,它是一个规范,通过这个规范,所有被独立编译的二进制实体才能被链接在一起并执行。这些二进制实体必须在一些很低层的细节上达成一致,例如:如何调用函数,如何在内存中表示数据甚至是如何存储以及访问metadata。

    ABI是平台相关的,因为它关注的这些底层细节会受到不同的硬件架构以及操作系统的的影响。大部分的平台都定义了一份可以用于C以及C语言家族代码的“标准ABI”。但Swift是一门和C截然不同的语言,它需要为每一种平台定义自己的ABI。而这份文档中中的绝大部分内容都是和平台无关的,和具体平台相关的考量会影响到Swift ABI的设计和实现细节。如果你要了解不同平台上的“标准ABI”,可以参考附录中的内容。

    什么是ABI稳定?

    ABI稳定是指把ABI锁定在某种形式,以至于未来的编译器都可以生成遵从这种形式的二进制实体(可以是程序库,也可以是应用程序)。一旦ABI稳定了,就意味着它会伴着这个平台的一生一世,直至日益增长的依赖关系让它走向灭亡。

    ABI的稳定性仅会影响到外部可见的公共接口和符号的不变性。而内部使用的符号、调用约定以及内存格局仍旧可以修改而不会破坏ABI约定。例如,未来版本编译器完全可以在保留外部接口函数调用约定的同时,改变内部函数的调用约定。

    对ABI做的每一个决定都会对编程语言产生长远的影响,甚至会制约一门编程语言在未来可以发展和进化的空间。Swift未来的版本可能会在更多垂直领域为ABI添加特性,但只要声明了某个平台的ABI已稳定,那么任何在效率以及灵活性上曾经不妥的设计都将永远伴着这个平台存在。

    为ABI在垂直领域添加新的特性叫做ABI积累性更新(ABI-additive changes)。每当支持这个特性的Swift版本达到最小目标值的时候,就可以把这个特性纳入积累性更新。这种方式允许我们逐步扩展或锁定ABI中的内容。例如,让ABI支持更多特性,或使用更有效率的数据访问方式等。在这份文档后面,我们会看到很多这样的例子。

    ABI稳定了会怎样?

    ABI稳定之后,OS发行商就可以把Swift标准库和运行时作为操作系统的一部分嵌入,由于这些标准库和运行时可以支持用更老或更新版本Swift构建的应用程序,这样,开发者就无需在分发应用的同时,还要带上一份自己构建应用时使用的标准库和运行时拷贝。这使得工具和操作系统可以更好的进行集成。

    就像之前提到的一样,对二进制程序库来说,ABI稳定是必要但不充分的。模块文件格式的稳定性也是必须的,但这超出了这份文档讨论的范畴。

    程序库的进化

    通常,如果一门编程语言在表现力和性能上均表现良好,并且还提供了二进制接口,它就很容易表现出二进制接口很脆弱的问题。对于用这种语言编写的程序库或组件来说,要让用户在不重新编译源码的条件下使用新版本的程序库是很难的。当前,Swift主要的前进方向是标准库的进化,自然就要给开发者在维护二进制兼容性这个问题上更多进退的空间。很多实现上的考量的确会对ABI的设计有所影响。

    因此,迟迟没有声明ABI稳定的一个主要目的,就是为程序库的进化保留足够的灵活性,而不希望开发者由于ABI的稳定性而限制设计空间。程序库在进化上的考量将会在下面每一个单独的章节中描述,但它们阐述的一个公共的观点则是有些设计细节仍旧没有确定下来。

    (To be continue...)

    展开全文
  • 译:Swift ABI (二)

    2019-04-08 19:08:11
    泊学翻译自Swift在Github上发布的Swift ABI Manifesto Swift ABI的构成 在实践中,ABI关注的内容是紧密耦合在一起的。但是,作为一个概念模型。我更愿意把它分成6个独立的分类: 1.和类型相关的,例如:所有的结构和...
  • Swift4 MD5加密

    2018-08-30 17:20:37
    现在大多IOS开发者对Swift持观望态度,原因无非是这门语言太年轻,不稳定之类的,再加之ABI稳定版本(据说是Swift5)不知何时能来,大家普遍生出了再等等的心态。然而,总结这几日的使用情况,Swift4.2的简洁和强大...
  • \看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料!\\\随着Swift 4.1进入beta阶段,Swift团队开始将注意力聚焦在新...\\Swift 4.2的主要目标是为ABI稳定性做准备,ABI将会...
  • Swift5 新特性预览

    2018-05-10 17:19:01
    Apple将在今年晚些时候大概秋季发布会发布Swift5Swift5主要焦点在于ABI(Application Binary Interface)对于Swift标准库的稳定,下面介绍Swift5特性: 1.ABI稳定 1.1什么是ABI稳定 在运行时Swift二进制文件通过...
  • 原文链接 ABI 的稳定,会让 Swift 在 Apple 平台上有更大的发展。不过由于历史原因,在系统支持和兼容性方面,我们还会面临一些问题。Swift 官方博客也专门发...随着 Swift 5 的发布,SwiftABI 也终于稳定下来...
  • 最近发布在swift-evolution邮件杂志上的《Swift ABI稳定性宣言》旨在汇编公开宣称Swift ABI稳定前所需解决的所有问题。\\《Swift ABI稳定性宣言》的作者——苹果公司工程师Michael Ilseman写道,ABI稳定性的目标包含...
  • Swift 5已经发布下面是官方swift5的介绍。 IntroducingSwift 5.1 Swift 5.1now makes it easier to create and share binary frameworks with others. It also includes features that make it easier to design ...
1 2 3 4 5 ... 20
收藏数 897
精华内容 358