Swift 的类型体系

猛戳看最终版@SwiftGG

Brent Simmons 在 解决目前不存在的问题,就好像问题存在一样 中说到:

Swift 的类型体系解决了我没碰到的一个问题。

对这句话我深有同感,而且我敢打赌很多其他的 Objective-C 开发者也会这样觉得。

在我刚开始尝试使用 Swift 时,编译器似乎经常和我做对 1 。但随着我对这门语言越来越熟悉,情况也随之变得好起来,但是有时它奇怪的错误信息还是会让我觉得它是一个难以取悦的任性小孩。

在这样的情况下,Swift 严格的类型检查所带给你的好处相比你为了让代码运行所付出的努力就少之又少了。即便如此,它的类型体系还是在去年成长到了让我再也不想错过它的程度。

Swift 更好理解

相比 Objective-C 我更喜欢 Swift 最大的原因不是他的类型体系,而是一些更平凡的特性

  • 一等公民值类型。可以把 integer 或者 struct 在不使用 object 包装的情况下就放到 array 中,这可以说是大赢,因为这意味着我们可以对这些类型进行扩展。
  • 枚举有关联值。还有元组。在 Swift 中构建数据结构模型变得更加清晰。
  • 模式匹配
  • 更清晰的语法且没有头文件。

简而言之,Swift 是现代语言,而 Objective-C 显然不是。

如果 Apple 在去年发布了真正的 “Objective-C 3.0”,在保留 Obj-C 动态特性的情况下使其现代化 2 ,我将会更加开心并且可能永远不会主张更加静态的类型检查。毕竟,“我知道我所做的事情,而且我永远不会因为数组里面包含意外类型而导致错误。”

Hole-Driven 开发

但是 Apple 给了我们 Swift, 而不是 Objective-C 3.0。Swift 的发布促使我去了解其他有同样类型体系的语言,比如 Haskell,ML 和 Scala。我从那些社区学到的特别的一点就是 hole-driven (或编译驱动)开发 :不要把编译器当作需要你对抗的一股力量,而是把它当作可以解决你问题的一件神器,根据类型一步一步滴来。

Hole-Driven 开发在构建数据结构模型和数据转换时可以说是梦幻般的技术( Haskell 和它的同类尤其擅长),而且尽管还有可提升的潜力,它在 Swift 中依然表现滴相当棒。烦人的编译器和有益的编译器最关键的不同点在于它的错误信息是不是易于理解,而很多 Swift 的诊断信息仍然相当神秘 3 。

对于典型的 GUI 编程, 编译驱动开发可能没那么有用,尽管我认为这主要归根于 Cocoa API 的设计而不是编译驱动开发固有的限制。像 ReactiveCocoa 这样的库就向我们展示了类型体系(在一定程度上说应该是清晰的语法)设计出来的 API 是什么样的。当你可以依赖一个幸亏有泛型的编译器来做多步的 复杂信号变换 ,保证结果的正确性将会变得更加简单。现在我发现在 Objective-C 中写这样的代码要难得多(随后也更难理解),因为我需要在我脑海中记更多的东西。

自动文档

严格的类型体系带来的另外一个巨大好处就是做为副产品生成的自动文档。做为 Apple 平台上的开发者,我们访问不到我们最常使用的库的源代码,所以我们需要依赖文档。编译器强制 API 设计者提供的信息越多,使用 API 的人就越方便。单可选注释就给 Cocoa 的文档提供了极大的提升 4 。想象一下如果所有 Cocoa 的 API 的方法参数和返回值类型都是 id。头文件基本上就没什么用了。

总结

在强制我自己对类型进行非常仔细的思考之后,我发现我 Swift 代码的设计更好了,也更容易维护了。我对我代码的正确性也更加有自信了,而且更奇怪的是:写起来也更有趣了!(PS:此处有强烈的补肾丸广告即视感)

Swift 仍然在起步阶段。有时它可能会让你沮丧,但是随着时间的推移编译器提示的错误信息会更友好,甚至可以让你的代码更加合理。比如说我们都在纠结的一个例子,并发:如果编译器可以静态滴证明你的多线程代码不存在冲突,那就是一个巨大的优势。Swift 现在还不能做,但是 Rust 可以 。对次我相当兴奋。

1.这也是我觉得 Swift 果断不是一门易学(易教)语言的原因之一。另外一个就是复杂的标准库

2.我们几十年来都在使用“没有 C 的 Objective-C”,而是以 Smalltalk 的形式

3.毫无疑问,至少有一部分原因是我对语言比较陌生

4.我需要提醒大家的是注释是不保证正确性的,所以严格滴说它们没有头文件注释可靠。也许有人会认为仅仅一个严格的编译器就可以强制让 Apple 的文档更加精确。

时间: 2024-08-10 09:22:42

Swift 的类型体系的相关文章

Swift 集合类型(Collection Type) 之 字典(dictionary)(官方文档翻译及总结)

Swift语言提供经典的数组和字典两种集合类型来存储集合数据.数组和字典中存储的数据值类型必须明确.这意味着我们不能把不正确的数据类型插入其中.Swift对显式类型集合的使用确保了我们的代码对工作所需要的类型非常清楚.也让我们在开发中可以早早的找到任何的类型不匹配错误.如果你用变量(var)创建的集合,这些集合就是可变的(增删改).如果用常理创建的,这些集合是不能被操作的. 注意: 如果集合的元素是不变的,那就将集合声明为常量.这样Swift编译器能对你创建的集合做性能优化. 1. 数组(arr

swift基本类型

一.数字类型: Swift数字类型之间的转换Swift是一个安全的语言,对于类型的检查非常严格,不同类型之间不能随便转换. 1.整型之间的转换:在C和Objective-C等其他语言中,整型之间有两种方法 从小范围数到大范围数转换是自动的: 从大范围数到小范围数需要强制转换,有可能造成数据精度的丢失. 而在Swift中这两种方法是行不通的,我们需要通过一些函数进行显示地转换,代码如下: let start:uint8=10; let end:uint16=20: let total=start+

.net ——流的类型体系简单介绍

流的类型体系 基础流 装饰器流 包装器类 帮助类 继承自基本的stream流 在基础Stream上添加的功能 数据传输 对文件流的操作变简单 基础流 Stream 对应的后备存储是文件 内存 网络资源 FileStream MemoryStream NetWorkStream IsolatedStorgaeFileStream: 继承自FileStream 感觉还是挺类Java的. 装饰器流 BufferdStream DeflateStream GZipStream CryptoStream

Swift数字类型之间的转换

Swift数字类型之间的转换Swift是一种安全的语言,对于类型的检查非常严格,不同类型之间不能随便转换.一.整型之间的转换在C和Objective-C等其他语言中,整型之间有两种转换方法:从小范围数到大范围数转换是自动的:从大范围数到小范围数需要强制类型转换,有可能造成数据精度的丢失.而在Swift中这两种方法是行不通的,我们需要通过一些函数进行显式地转换,代码如下: let historyScore:UInt8 = 90 let englishScore:UInt16 = 130 let t

Swift基础类型

1.使用 let 来声明常量,使用 var 来声明变量. 注:你能够在一行中声明多个常量或者多个变量.用逗号隔开. 2.类型标注 假设初始值没有提供足够的信息(或者没有初始值),那你须要在变量后面声明类型,用冒号切割. let variable: String 注意:一般来说你非常少须要写类型标注. 假设你在声明常量或者变量的时候赋了一个初始值,Swift能够判断出这个常量或者变量的类型. 3.输出函数println 和 print println:是一个用来输出的全局函数,输出的内容会在最后换

swift 集合类型(二)

说到swift的集合类型,就不得不谈到Dictionary.包含一个键值对组合的集合. var air = ["name":"warner","title":"Math"] var air = Dictionary<String,String>(minimumCapacity:3) 都可以初始化Dictionary.在swift中,Dictionary其实是一个结构:struct,继承自Collection.而Co

Swift基础 -- Swift集合类型(数组和字典)

Swift提供了两种集合类型来存放多个值——数组(Array)和字典(Dictionary).数组把相同类型的值存放在一个有序链表里.字典把相同类型的值存放在一个无序集合里,这些值可以通过唯一标识符(也就是键)来引用和查找. 在Swift里,数组和字典里所能存放的值的类型是明确的.这意味着你不能误把一个错误类型的值添加到数组或字典里,也意味着你可以明白无误地知道从数组 或字典里取得的值会是什么类型的.Swift集合是类型明确的,这保证了你的代码会清楚地知道它们所能处理的值的类型,并让你能在代码开

Swift集合类型(数组和字典)

Swift提供了两种集合类型来存放多个值——数组(Array)和字典(Dictionary).数组把相同类型的值存放在一个有序链表里.字典把相同类型的值存放在一个无序集合里,这些值可以通过唯一标识符(也就是键)来引用和查找. 在Swift里,数组和字典里所能存放的值的类型是明确的.这意味着你不能误把一个错误类型的值添加到数组或字典里,也意味着你可以明白无误地知道从数组或字典里取得的值会是什么类型的.Swift集合是类型明确的,这保证了你的代码会清楚地知道它们所能处理的值的类型,并让你能在代码开发

Swift字符串类型

字符串初始化 1.初始化 let someString = "Some string literalvalue" let wiseWords = "\"Imagination is moreimportant than knowledge\" -Einstein" let dollarSign = "\x24" // $, Unicodescalar U+0024 let blackHeart = "\u2665&q