原文: Looking back on Swift 3 and ahead to Swift 4
作者: Chris Lattner
译者: kemchenj

大家好,

Swift 3的正式版已经接近完成状态了,是时候来回顾一下发布之前的事情,从中汲取经验,并且用来整理一下我们(Swift社区)在今年做的事情了. 总的来说,Swift 3无疑将会是一个Amazing的版本,我们做到的很了不起,谢谢每一个为这件事情贡献力量的人. 比起马上推进那一堆新计划,更重要的是让我们每个人从整个大局来看,了解自己做到的这些了不起的事情.

Metapoint: 这份邮件很长而且覆盖了很多主题,比起直接回复,最好还是重新开一个对话来对单独的一个话题进行讨论,在主题上标上[Swift 4]就好了.

Swift 3回顾

每年Swift的开发都会跟前一个版本完全不同,我预计Swift 4也会延续这个习俗,为了每一年都要有所收获有所提升,我总结了一下这些关于Swift 3开发过程中的观察和回顾:

  • 开源万岁. 看到这么一个有活力的社区合作得这么好真的是让人觉得很不可思议,而且看到你们一夜之间几乎都过来帮忙了. 能和这样一个才能和热情兼顾的团队一起工作真是一件非常棒的事情.

  • 开源同样也带来了一些挑战. 我觉得Open Design确实还是比Closed Design进展得更加慢而且更加不可预计. 然而,最后的结果也是比Open Design明显更胜一筹,权衡之下还是很值得的. 所有在Swift Evolution进展过程里帮助过我们的人,送给你们一个大大的感谢...

  • 软件项目管理(特别是开源项目)一如既往的难以预料. 我们给Swift 3设定了一系列过高的目标,以至于最后不得不删减掉一部分,目标定得高是一件好事,但我们需要更好地告诉大家这些"目标"并不是"承诺",以免大家感到失望.

  • 对少数几个主题的专注. 如果有太多的主题同时推进,那就没人能持续跟进所有主题了. 核心团队有必要在一些关键的讨论里及时介入. 在Swift 3的开发流程里,很大的一个问题是,很多的fork在审核结束之前都没有时间去跟进所有的讨论.

  • 拥有清晰地目标是一种解放. 特别是在十二月和一月份这一段时间里,我们把目标定为适合Swift 3的那些Proposal,并且同时开展了好几个计划,结果我们发现这已经大大超出我们能完成的范围了. 在后来的版本里,我们有非常明确的目标(例如,不再增加计划),从而让我们节约更多精力去专注在那些重要的事情里.

  • 让所有人的满意是不可能的. 特别是在讨论要选哪些Feature和定优先级的时候,因为有些明显是低优先级的事情. 这是必然的,因为不可能让所有有趣的东西在一年的开发里都塞进一个版本里. 所幸,总会有另一个版本,每一个新的版本都会成为一次大改进的其中一小步.

以此为背景,让我们继续说下去!

Swift版本计划

下一年,核心团队预计可以完成两个Swift的大版本: 2017年春季推出Swift 3.x,还有同年秋季发布的Swift 4. 除了大版本之外,我们也保证会更新一些小版本(例如 Swift 3.0.1)来修复bugs,或者是核心库需要的服务,或者其他Swift.org的计划.

Swift 4版本规划

从Swift 3的经验来看,我们知道我们必须有所选择. 对于Swift 4来说,一个主要的目标就是保持Swift 3.0到4.0的代码稳定(API稳定),并且把标准库的ABI稳定下来. 由此,核心团队决定把开发计划分为两个阶段:

第一阶段:

专注代码稳定和ABI稳定的工作,对于这份工作保持合理的专注. 这意味着任何不会从根本上更改现有Feature的ABI,或者对于标准库不会有破坏性的修改在这个阶段都不会考虑(就是说这个阶段要进行的修改都是破坏性的). 例如,泛型功能里的Condition Confomance是一个附加功能,但因为它的增加会对标准库产生很多影响,所以这就会是第一阶段的任务. 另一方面,语法方面的支持对于现有ABI或者标准库都不会有大改变,所以不太适合在第一阶段完成.

第一阶段的工作很重要(下文有更多细节),所以我们春季之前都会比较忙碌.

第二阶段:

设计和实现会在第一阶段完成的七七八八,我们会根据剩余的时间去完成一些比较大型的feature,我觉得我们应该能有时间去推进下边表里的一部分Feature,不过得到我们了解具体剩余的时间才能知道是哪一部分.

除了新Feature之外,我们也需要重新评估一下那些我们已经接受了的,会对代码有破坏性,但还没加入到Swift 3里的提案. 这些提案没必要一定要定下来,我们需要考虑Swift 4的目标,根据每个提案的具体情况进行评估.

最后,这跟Swift-Evolution没有特别的关系,只是我个人想要质量和性能兼备,核心团队想要继续提高质量,包括修复bugs和提高error和warning的算法. 性能优化也是我们开发中一直在做的事情,包括提高代码质量,提高标准库的实现,加快编译速度等等. 所有这些工作都可以同时进行.

Swift 4第一阶段目标

为了专注于代码和ABI稳定,核心团队对于第一阶段的规划有一个初步的讨论. 这几个Feature是我们在第一阶段定为最优先的:

  • 代码稳定: 这件事情虽然很小,但很重要. 例如,我们需要在编译的时候加上-std=swift3之类的命令. 我们也提供了一个途径去提供一个不稳定的开发环境,以便我们更容易去测试.

  • 适应性'Resilience': 这个Feature提供了一个方法能够在ABI稳定的情况下,让Public API能够持续演变. 例如,我们不想要C++里Fragile Base-Class的问题发生在Swift里. 很多设计和实现都已经在Swift 3里完成了,但还有一些关键的部分还没完成,包括用户在模型里能看到那些(例如新的属性).

  • ABI细节处理: 在现代的代码模型里,还有一大堆细节需要我们去认真评估和优化. 这跟Swift的开发关联比较大,而不只是Swift-Evolution的话题.

  • 泛型的提高: 我希望Conditional Conformances能够排在这个列表的最前面,还有协议递归约束(Recursive Protocol Requirements)以及更多强力的相关类型约束. 然而,绝对有必要去消除掉剩下的那些 "_" 协议还有以正确的方式长期呈现. (However,the standard library gurus need to break down what is absolutely essential to finally eliminate the rest of the “_” protocols and manifest the public API of the standard library in the right way for the long term.)

  • 新的字符串API范式: 字符串是一门语言里其中一个重要的基础类型. 标准库的主导团队有很多提高编程范式和想法,而且不会跟Unicode-correct-by-default的范式冲突. 我们的目标是在字符串处理上比Perl做的更好.

  • 内存所有权Memory Ownership Model: 在Swift添加类似于Cyclone/Rust的那种内存所有权机制,在系统编程人员和希望获取到可预计可控制(例如,实时音频处理)的人里呼声很大. 跟Swift 4更相关的是,这个Feature的重要性在于它会从根本上改变ABI. 它解释了编译的时候inout是如何处理的,addressors在ABI里处于哪一层抽象,影响Swift的运行时,还会对类型系统和Name Mangling产生巨大的影响.(It informs code generation for “inout",how low-level “addressors” work in the ABI,impacts the Swift runtime,and will have a significant impact on the type system and name mangling.)

这里面每一个部分我们都有一些想法了,但距离一份完整的提案还有很长的一段的路. 我预计,也希望这些想法能今早进入Swift 4的主要讨论里. 甚至,我们还没有完整的了解这些将会如何影响ABI稳定,随着我们的了解加深也许会有更多其它具体的影响. 最后,我们也许会专注于某个会能够对Swift包管理器或者其它Swift.org计划具有很多价值的Feature.

Swift 4第二阶段 可能的努力方向

就像我前面提到的,在这个时间点我们是不可能知道第二阶段的时候我们的进度,因为我们并不知道这段时间会有多长. 为了能够在正式版来临之前修复更多bug,以及让这一个版本的生命周期变得更长,核心团队更倾向于在Swift 4开发的时候延续Swift 3的开发周期.

所以说,我觉得我们应该能够完成相当一部分新Feature,我对这件事情很乐观. 给你一些它们的概要,我整理了一份列表,但记住,这不是一份计划或者承诺,这只是一份普遍要求的feature的列表:

  • 反射Reflection: 核心团队承诺过要一些强力的动态feature. 例如Swift 3已经完成了数据反射data reflection的基础建设(已经用在了Xcode的内存分析). 我们应该利用这些基础设置去构建一个强大的面向用户的API. 同样的,我们也想要设计和构建动态函数反射的runtime以及API的支持.

  • First class concurrency: Actors,async/await,atomicity,memory model和相关的话题. 大家对于这个feature有很强烈的需求,因为它会引入所有客户端,服务端以及其它更多方面的新东西. 我们计划在第二阶段开始正式讨论这个,但很明显一个新的并发模型不会在Swift 4的开发周期里做出来,道理很简单,因为这件事情需要花费超过一年的时间去设计和实现,而且我们希望用足够的时间去把这件事情做对做好. 在这件事情完成之前,Memory Ownership Model更容易理解(It also makes sense for the memory ownership model to be better understood before taking this on).

  • 泛型增强: 泛型计划包含了许多令人兴奋的泛型系统的改进,里面很多都对于标准库ABI稳定没有要求,但这会让Swift的泛型更加强力和易于表达.

  • Swift模块稳定: 某程度上说我们需要.swiftmodule二进制库稳定下来,以便第三方库的使用(或者使用另一种机制). 这里面有很多工作需要完成,并且需要标准库的ABI稳定.

  • 新的文本feature: 常规的书写方式,多行字符串字面值连接multi-line string literals之类的. 有这些功能会让Swift更加吸引那些需要文本处理和使用web技术的人. 这也会帮助完成字符串的模型.

  • Property behaviors: 这个feature可以在现有的Property模型里提供更加强大的抽象. 被推迟的SE-0030计划阐释的很清楚.

  • 其他的还有许多,Submodules,implicit promotions between numeric types,导入C++的API,hygenic macro system,尾调用约定(guaranteed tail calls),可遍历的枚举,thows类型,自定义属性User defined attributes,抽象函数/类abstract methods/classes,更好的SIMD支持,dynamic for non- at objc(目前的dynamic本身是基于objc的runtime),data parallelism,higher kinded types,...

  • 语法糖: 我不会把这些全部列出来,但是总是有很多别的零零碎碎的Proposal提交上来,特别是那些别的语言用来解决特定问题的方案. 这在Swift 4里优先级别最低.

就这样,一份很长的邮件,包含了一些我们关于明年要做的事情的想法. 还有一件特别的事情就是我知道Swift 3还没完成. 当破坏性的修改完成之后,还需要时间去修复bug和其他一些优化,这些都很重要.

我觉得现在花点时间来讨论一下我们明年的开发计划还是很有帮助的,然后把第一阶段的feature的概念全部理顺,我们只应该去写那些容易理解的特殊设计. 看到一大堆提案在那里摆着,然后没有足够的时间去跟进它们,核心团队不想陷入这样的境地,我们只想处理那些摆在我们面前,大型的,重要的,优先级高的计划.

Thank you. 再强调一次,如果你想要深入探讨某个话题的话请重新开一个分支.

-Chris

【译】回顾Swift 3, 展望Swift 4的更多相关文章

  1. ios – 无法识别的选择器发送到实例NSTimer Swift

    解决方法让updateTime成为一个类方法.如果它是在一个纯粹的Swift类中,你需要在@objc前面说明该方法的声明,如:

  2. ios – 如何在Swift中使用没有类型参数的泛型类?

    解决方法Swift还不像Java那样支持wildcard-stylegenerics(即Animal

  3. ios – 类型推断(自动类型检测)如何在swift中工作?

    LLVM如何检测变量是一个字符串?

  4. ios – Swift可选项:语言问题,还是做错了什么?

    应该有可选的类型;type是但是,如果我这样做,它的工作原理:它似乎是基本的替代,但我可能会遗漏一些语言的细微差别.谁能对此有所了解?之后就像暧昧一样,更多,这是我的解决方案:这适用于所有非对象Swift对象,包括Swift字符串,数字等.感谢Viktor提醒我String不是Swift中的对象.如果您知道值的类型,您可以替换任何?使用适当的可选类型,如String?

  5. ios – 如何在Swift中向下转换/转换结构的泛型类型

    我是否必须将这些存储为Any的数组,然后每次都将它们转换为或者我只是误解某些(或两者)?

  6. ios – 覆盖Swift中的超类委托

    我正在开发一个包含两个UIViews的Swift(v1.2)项目.MyView和MyViewSubclass.MyView有一个委托,我想在MyViewSubclass中覆盖它作为一个子协议,类似于UITableViews有一个UITableViewDelegate,它也符合超级uiscrollviewdelegate.我的第一个想法是覆盖超类属性,但这会导致编译器错误,因为子类不能覆盖具有不同类

  7. ios – 我可以在swift中将字符串转换为代码块吗?

    有没有办法将字符串转换为代码块?

  8. ios – Swift:方法重载只在返回类型上有所不同

    我一直在看Swift类,其中定义了两种方法,它们的返回类型不同.我不习惯使用允许这种语言的语言,所以我去寻找描述它如何在Swift中工作的文档.我在任何地方都找不到任何东西.我本来期望在Swift书中有关于它的整个部分.这记录在哪里?

  9. ios – 字符串资源Xcode swift

    我是iOS开发和Swift语言的新功能.而且我尝试制作简单的iOS应用程序,我需要在应用程序中使用一些字符串资源.当然,我可以将这个字符串放在我的*.swift文件中作为常量,但我认为这是一个坏的方法.我该怎么做?

  10. ios – 在XCTestCase子类中使用泛型有效吗?

    我有一个XCTestCase子类,看起来像这样.为了简洁起见,我已经删除了setup()和tearDown方法:它的子类看起来像这样:在理论上,这应该按预期工作–编译器不会抱怨任何事情.但是只是当我运行测试用例时,setup()方法甚至没有被调用.但是,它表明当testName()方法应该失败时,测试已经过去了.使用泛型是一个问题吗?我可以很容易地想到很多非通用的方法,但是我很想写这样的测试用例.这是XCTest在Objective-C和Swift之间的互操作性?Ergo您的通用XCTestCase子类不

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部