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