Swift 4 路线图

  • Sergio De Simone
  • 谢丽

2016 年 10 月 25 日

话题:移动iOS语言 & 开发

Swift 4 预计在 2017 年底发布。该版本旨在源代码和 ABI 层面实现语言的稳定性,新增特性将会包括改进后的泛型以及一个受 Rust/Cyclone 启发的内存所有权模型。

Swift 4 的开发将分成两个阶段。第一阶段将包含所有使 Swift ABI 稳定所需要的特性,同时又要保证兼容 Swift 3 源代码。第二个阶段还有点不确定,可能也会包含大大小小的新特性,前提是它们不会改变现有语言特性的 ABI 或者破坏到标准库的 ABI。

源代码兼容性

虽然稳定性可能会妨碍语言能力的发展,但源代码兼容是一个基本要求。为了推动语言的快速发展,同时又保证源代码兼容性,Swift 团队将扩展现有的 @available 属性,让它既可以表示某项特性与特定的平台或操作系统版本有关,也可以表示和特定的 Swift 语言版本相关。

例如,你可以通过下面的代码声明一个 API 在 Swift 3.1 中已废除:

@available(swift, obsoleted: 3.1)

class Foo {

//...

}

ABI 稳定性

使 Swift ABI 稳定一方面需要为将要新增的特性奠定基础,这是通过“弹性(resiliency)”特性实现的,它会提供一种方法,让公共 API 在演化的同时保证 ABI 的稳定性。这是可以实现的,例如,明确 API 的哪些部分可以变,而又不会破坏 ABI,从而减少在某些面向对象语言中出现的脆弱的基类问题。

另一方面,使 ABI 稳定需要清理掉语言中现有的依赖,那样,它们就不会成为 ABI 的固定部分。特别地,有许多这样的改进已经得到确认,比如:

  • 条件一致性:它表达的意思是,一个泛型类型,只有当它的类型参数满足特定的要求时才符合特定的协议。以 Array 集合为例,只有当它的元素是 Equatable 类型时,才能实现 Equatable 协议:

    extension Array: Equatable where Element: Equatable {
      static func ==(lhs: Array<Element>, rhs: Array<Element>) -> Bool { ... }
    }
    
  • 递归协议要求:允许关联类型与外围协议一致。例如,Subsequence 本身应该是 Sequence,因此,Swift 4 将允许下面这个当前不合语法的定义:

    protocol Sequence {
      associatedtype Iterator : IteratorProtocol
      ...
      associatedtype SubSequence : Sequence   // 当前不合语法,但应该可以 
    }
    
  • 关联类型的 where 语句:将现在可以在泛型类型参数中使用的、富有表现力的 where 带给了关联类型,例如:

    protocol Sequence {
      associatedtype Iterator : IteratorProtocol
      associatedtype SubSequence : Sequence where SubSequence.Iterator.Element == Iterator.Element
      ...
    }
    

最后,还有许多工作是为了在 Swift 4 中添加一个类似 Rust/Cyclone 的内存所有权模型。Rust 内存管理以实体所有权的概念为基础,通过它可以跟踪谁负责释放它或谁可以使用它。结合生存期的概念,可以避免最终释放实体时出现悬空引用。C 语言方言Cyclone(目前已经不再开发)就使用了一种基于区域的内存管理模型,为每个已分配实体指定一个区域,提高分配 / 释放的性能,更好地支持已释放实体的检测。扩展 Swift 内存管理模型对系统程序员以及所有迫切需要性能稳定的情况特别有用。可以预见的是,向 Swift 添加一种内存所有权模型已经超出了第一阶段的范围,该阶段的目标是有一个整体的设计,以便了解它将给 ABI 带来什么变化。

查看英文原文The Roadmap to Swift 4

移动iOS语言 & 开发