1.3 Swift语言演进

1.3 Swift语言演进

小荷才露尖尖角,早有蜻蜓立上头

长风破浪会有时,直挂云帆济沧海

俗话说得好:要想掌握一门学科先关注它的发展史,同样的,要想学好一门语言先看它的进化史。

任何一门卓越的语言,都有其独特的演进之路,Swift当然也不例外。下面我们简单了解一下Swift这只可爱的雨燕从青涩诞生到展翅成熟的历程吧。

酝酿

2010年7月,苹果开发部门高级总监、架构师克里斯·拉特纳 (Chris Lattner) 开始着手 Swift 编程语言的设计工作,在用一年时间完成基本架构后,他领导了一个设计团队全力参与其中。

2014年6月,Swift发布Beta版。

诞生

2014年8月,经过近4年的酝酿期,Swift 1.0正式版终于化茧成蝶。苹果官方宣称Swift的特点是:快速、现代、安全、互动,而且明显优于Objective-C语言。Swift以LLVM编译,可以使用现有的Cocoa和Cocoa Touch框架。

Swift 1.0

  • 在协议里新增了对构造器的规定和类的专属协议
  • 可选类型若有值时,不再隐式的转换为 true,同样,若无值时,也不再隐式的转换为false
  • 新增一个nil合并操作符(a ?? b)
  • 访问和修改数组,不能再通过 += 运算符给一个数组新增一个新的项。对应的替代方案是,使用append方法,或者通过 += 运算符来新增一个只有一个项的数组
  • 更新Required构造器, required 修饰符现在需要出现在所有子类的 required 构造器的声明中,而 required 构造器的实现,现在可以仅从父类自动继承
  • 在 声明修饰符 新增了有关 dynamic 声明修饰符、字面量类型推导以及柯里化函数等内容
  • 更新了字符串字面量以及扩展字符集等章节
  • @optional, @lazy, @final, @required 等关键字被更新为 optional, lazy, final, required
  • 更新有关 …< 的引用,从半闭区间改为了半开区间,且半开区间运算符从 … 更新为 …<
  • 数组类型速记语法 从 SomeType [] 更新为 [SomeType]
  • 新增 字典类型的速记语法,现在书写格式为: [KeyType: ValueType]

Swift 1.1

  • 新增可失败构造器完整指引,在协议中新增了失败构造器要求的描述
  • 常亮和变量的Any类型现在可以包含函数实例
  • 带有原始值的枚举类型增加了一个 rawValue 属性替代 toRaw() 方法,同时使用了一个以 rawValue 为参数的失败构造器来替代 fromRaw() 方法
  • 新增 Failable Initializer (可失败构造器),它可以触发初始化失败
  • 自定义运算符现在可以包含 ? 字符,更新了 运算符 涉及改进后的规则的部分,并且在 自定义运算符 中删除了重复的运算符有效字符集合

Swift 1.2

  • Swift现在自身提供了一个 Set 集合类型
  • @autoclosure 现在是一个参数声明的属性,而不是参数类型的属性。这里还有一个新的参数声明属性 @noescape
  • 对于类型属性和方法现在可以使用 static 关键字作为声明描述符
  • Swift 现在包含一个 as? 和 as! 的向下可失败类型转换运算符
  • 更新 区间运算符,注意当半开区间运算符含有相同的起止索引时,其区间为空
  • 更新 闭包引用类型,对于变量的捕获规则进行了阐明
  • 更新 值溢出,对有符号整数和无符号整数的溢出行为进行了阐明
  • 更新 协议声明,对协议声明时的作用域和成员等内容进行了阐明
  • 更新 捕获列表,对于闭包捕获列表中的弱引用和无主引用的使用语法进行了阐明
  • 更新 运算符,明确指明一些例子来说明自定义运算符所支持的特性,如数学运算符,各种符号,Unicode 符号块等
  • 协议类型转换不再局限于 @obj 修饰的协议

青春期

Swift从诞生之日起的青涩很快消退,随之而来是羽翼不断丰满。

Swift 2.0

  • 在 错误处理 中新增了有关错误处理的相关内容,包括 Do 语句、 Throw 语句、 Defer 语句 以及 try 运算符
  • 在 控制流 中增加了"尽早退出"的Guard 语句
  • 为 协议 增加了 协议扩展 的内容
  • 更新 字符串和字符,使得 String 类型在 Swift 标准库中不再遵循 CollectionType 协议
  • 在 自动闭包 中新增了有关 @autoclosure 特性的相关内容,包括它的 @autoclosure(escaping) 形式
  • 在 可选绑定 中新增了有关使用 where 子句进行多可选绑定的相关内容
  • 在 断言调试 中新增了一条提示,有关用户定义断言何时会失效
  • 在 错误处理 中新增了一条提示,有关执行 throw 语句的性能。在do 语句部分也新增了类似内容
  • 在 属性观察器 更新了一处提示,用来明确 willSet 和 didSet 观察器的行为

Swift 2.1

  • 更新 字符串插值 和 字符串字面量,现在字符串插值可包含字符串字面量
  • 在 逃逸闭包 中新增了有关 @noescape 属性的相关内容
  • 更新 声明特性 和 编译配置语句 中与 tvOS 相关的内容
  • 在 In-Out 参数中新增了与 in-out 参数行为相关的内容
  • 改进 自动闭包 中对自闭包的讨论。

Swift 2.2

  • 在 编译配置语句 新增了有关如何根据 Swift 版本进行条件编译的内容
  • 在 选择器表达式 中新增了了针对 Objective-C 选择器的 #selector 的语法
  • 更新 关联类型 和 协议关联类型声明 中有关使用 associatedtype 关键词修饰关联类型的讨论
  • 删除 C 语言风格的 for 循环,++ 前缀和后缀运算符,以及 – 前缀和后缀运算符

茁壮成长

可以看到从版本2.0开始,Swift潜力股指数已经开始爆棚,身上现代语言的优雅越来越浓郁。

从 Swift 3.0 开始,这些优势越来越明显,这些都为后来的语言稳定奠定了坚实的基础。

Swift 3.0

  • 新的GCD和Core Graphics
  • NS前缀从老的Foundation类型中移除
  • 内联序列函数sequence
  • 新增fileprivate和open两个权限控制
  • 移除了诸多弃用的特性,比如++、-- (两个–) 运算符等(因为和加1减1没有区别)
  • 增加区间运算符

Swift 3.0.1

  • 更新 自动引用计数 中有关 weak 和 unowned 引用的讨论
  • 在 声明标识符 中新增了有关新的标识符 unowned,unowend(safe) 和 unowned(unsafe) 的内容
  • 在 Any 和 AnyObject 的类型转换中新增了一条有关使用类型 Any 作为可选值的提示

Swift 3.1

  • 新增 范型 Where 子句扩展,包含需要的扩展内容
  • 在 For-In 循环 中新增了区间迭代的例子
  • 在 声明特性 中新增了有关使用 Swift 语言版本的 available 特性的内容
  • 更新 函数类型 中的讨论,注意在写函数类型时不允许使用参数标签
  • 更新 条件编译块 中 Swift 语言版本号的讨论,现在可以使用可选的补丁版本号
  • 更新 函数类型 的讨论,现在 Swift 区分了采用多参数的函数和采用元组类型的单个参数的函数
  • 在 表达式 中删除了动态表达式的章节,现在 type(of:) 是 Swift 标准库函数

Swift 4.0

  • 在 内存安全 新增了有关内存互斥访问的内容
  • 新增 带有泛型 Where 子句联类型,现在可以使用泛型 where 子句约束关联类型
  • 新增 范型下标,现在下标也支持范型特性了
  • 更新 拓展声明 中有关协议扩展的讨论,现在它们不支持 final 特性了
  • 在 断言和前置条件 中新增了部分前置条件和致命错误的内容

Swift 4.1

  • 更新 Key-Path 表达式,现在 key path 支持下标子路径
  • 在 等价运算符 中新增了有关等价运算符的合成实现的内容
  • 申明拓展 和 协议 中的有条件地遵循 协议里新增了有关协议有条件遵循的内容
  • 在 关联类型约束中使用协议 中新增了有关递归协议约束的内容
  • 在 条件编译块 中新增了有关 canImport() 和 targetEnvironment() 平台条件的内容

Swift 4.2

  • 在 遍历枚举 中新增了有关访问所有枚举情形的内容
  • 在 编译诊断 新增了有关 #error 和 #warning 的内容
  • 在 属性声明 中新增了有关 inlinable 和 usableFromInline 属性的内容
  • 在 可选编译块 新增了有关如何根据 Swift 编译器版本对代码进行对应编译处理的内容
  • 在 字面量语法 新增了有关 #dsohandle 的内容。

成熟

从5.0版本开始,Swift正式成为一门“标准化”的语言,你再也不用担心5.0之后的版本会带来不一致的行为了。

在这里插入图片描述

Swift 5.0

  • Swift 5.0 带来了 ABI 的稳定
  • 新增 拓展字符串分隔符 ,更新了 字符串字面量,拓展有关字符串分隔符的内容
  • 新增 动态调用,其中包含使用 dynamicCallable 属性动态调用实例作为函数的内容
  • 新增 unknown 和 未来枚举匹配 内容,其中包含了使用 unknown 来处理未来枚举可能发生改变的情形
  • 在 Key-Path 表达式 新增了有关标示 key path (.self) 的内容
  • 在 可选编译块 新增了有关小于比较符 < 的内容

Swift 5.1

  • Swift 5.1 带来模块的稳定
  • 优化二进制编译结果的大小,通常会减少10%的体积;如果开启 ‘Optimize for Size‘ 就是 15% 的减少
  • Swift和ObjC桥接更快了
  • Swift的SourceKit更全面的压力测试
  • 引入LSP(Language Server Protocol)
  • 单行表达式隐式返回
  • 带默认值的结构体初始化
  • 新的字符串插值
  • 抽象化的返回类型(引入关键字some)
  • 属性包装器的引入
  • DSL(Domain Specific Languages,领域特定语言)

可以这样说,Swift真正的精彩是从5.0开始的,5.0给我们带来了一个统一的Swift。

那么5.0版本之后的Swift究竟为我们带来了什么?它与之前Swift版本不同的革命性意义又体现在哪里呢?下面我们就一起来深入解一下。

猜你喜欢

转载自blog.csdn.net/mydo/article/details/106760653
1.3