Swift简介

35 阅读5分钟

Swift发展历史

2014年8月, 1.0版本发布
2015年9月, 2.0版本发布

  • Error Handlering 增强: (区别于NSError, 通过throw关键字来指定函数的方法抛出何种错误,在调用之处可以通过do try catch 等处理错误)
  • guard 语法: 指定某种希望得到的状态, 而不是检查错误情况之后,比if...else语句方便
  • 协议支持扩展

2015年12月, 正式开源
2016年9月, 3.0版本发布

  • 新的GCD 和 Core Graphics:C->面向对象
  • NS前缀从老的Foundation类型中移除: NSData, NSURL -> Data, URL
  • 内联序列函数 sequence
  • 新增 fileprivate 和 open 权限控制 : 对private和public的进一步细化,原来声明为私有的实体, 只能在声明的范围内被访问, 在扩展里不允许访问;fileprivate将使用限制定义在源文件中,既可以在原类也可以在协议里访问。 (open > public > fileprivate > private)
  • 移除了诸多弃用的特性: 如++, -- 运算符

2017年9月, 4.0版本发布

  • extension中可以访问private属性
  • 类型和协议的组合类型: 使用and运算符 来组合类型
  • Associated Type可以追加 Where 约束语句 : 通过Where语句,给类型进行约束, 使其使用上更加严谨
  • 新的Key Paths语法: 使用反斜线\;增加类型安全和类型推断; valueForKeypath 的返回值 由 Any 变为实际类型; 适用于值类型。
  • 下标支持泛型 : 省去了 as? 对 Any的 转换类型
  • 字符串增强

2019年3月, 5.0版本发布

  • ABI 稳定 : 二进制稳定, 运行时只要使用swift5 编译出的二进制, 就可以运行在任意 swift5 及 以上 的runtime上。(无需再往包内放一个很大的runtime)
  • Raw String: 创建原始字符串, #“” 包裹字符串 (引号内 的\等 都会解释成符号本身, 而不是转义字符)
  • 标准库新增 Result
  • 定义了与 Python 或 Ruby 等脚本语言互操作的动态可调用类型

Swift 和 OC的主要区别

1⃣️ 从编程范式角度:

1⃣Swift借鉴了很多语言的语法特性,更加现代化,引入了协议, 协议扩展,泛型,Pattern-Match等新特性,可以更好的面向协议编程
2⃣将 函数 和 闭包 提升为 语言的 一等公民 (函数可以作为变量, 可以作为其他函数的参数, 可以做函数的返回值), 可以使用Swift进行函数式编程, 也提供了一些高阶函数更好的辅助进行函数式编程
3⃣亦可以进行面向对象编程

而OC, 以面向对象编程为主,也可以引入ReactiveCocoa的类库来进行函数式编程,但并不是语言本身提供的。

2⃣️ 从类型安全角度:

Swift是一门类型安全的语言。鼓励程序员在代码中清楚明确值的类型。如果代码中使用一个字符串String, 那就不能错误的将一个整型Int赋值给它,Swift会在编译期做类型检查,并且把所有不匹配的类型作为一个错误标记出来,使程序员在开发过程中尽可能早地发现和修正错误。

而OC,则不会在编译期检查类型错误, 即使声明了一个NSString 类型的变量, 仍然可以赋值 NSNumber类型,并作为 NSNumber 来继续使用, 但如果继续作为 NSString 类型来使用, 则可能会Crash。

3⃣️ 从值类型角度:

Swift中, 典型的值类型有 struct, enum, tuple。同时 Int, Double, Float, String, Array, Dictionary, Set 也是值类型 (他们都是用 struct 实现的)

而OC中, NSNumber, NSString以及集合类对象都是 指针类型。

值类型相当于指针类型有诸多好处:

1⃣不变性:值类型的变量是严格被一个所有者控制的,当所有者A 传递给 所有者B一个值类型变量时, 所有者B 拿到的是这个值类型的一个 副本内容, 当所有者B 对变量修改时,不会影响 所有者 A 所持有的值。

2⃣独立性: 引用类型是可能相互依赖的

3⃣可交换性。

4⃣️ 从枚举类型角度:

Swift 枚举增强,可以使用整型, 浮点型, 字符串等作为枚举的值; 还能拥有属性和方法; 也支持泛型, 协议, 拓展等

而OC, 枚举类型比较鸡肋, 只是个标记值。

5⃣️ 从泛型角度:

Swift 是 支持 泛型的, 也支持泛型的 类型约束等特性。泛型可以更加好的进行面向对象编程 及 类型抽象。

而在Swift2.0版本推出时, 为了让开发者更好的过渡到Swift上, 苹果也为OC带来了 Generics 泛型支持, 不过 OC 的泛型约束只停留在编译器警告阶段。(即使定义了一个泛型, 在运行期也可以赋值一个不同类型)

6⃣️ 从协议和扩展角度:

Swift对协议的支持非常丰富, 配合Extension, 泛型, 关联类型等可以实现面向协议编程, 从而大大提高了代码的灵活性。同时, Swift中的 protocol 还可以用于值类型, 如 结构体 和 枚举。

OC 的协议缺乏强约束, 提供的 optional 特性往往成为很多问题的来源(可能在运行期Crash, 对象并没有实现这个optional的协议, 所以为了安全的调用, 不得已先要判断对象是否已实现该协议方法), 而如果放弃 optional 又会让实现代价过大。

7⃣️ 从函数和闭包角度:

Swift 函数是一等公民, 可以直接定义函数类型的变量, 可以作为其他函数的参数 以及 返回值,进而十分方便的进行函数式编程。

OC中的函数是次等公民, 需要 selector 封装 或者使用 block 才能模拟 Swift 中的类似效果。