Skip to content
Wei Wang edited this page Nov 24, 2015 · 14 revisions

版本 2.1.0 (2015 年 11 月 24 日)

  • 对应 Swift 2.1。
  • 添加《安全的资源组织方式》一节,介绍使用 enum 或者 struct 等在编译时进行资源组织以保证安全性。
  • 《单例》 修改了单例的写法,使用了更加简洁的形式,并且添加了对私有 init 的说明。
  • 由于编译器的进步,struct mutating 现在有更好的错误提示了,因此删除了《Struct Mutable 的方法》一节。
  • 《@autoclosure 和 ??》 一节中关于默认值的说明不太清晰,追加了说明。
  • 修正了一些错别字。

版本 2.0.2 (2015 年 9 月 19 日)

  • 调整了在 Kindle 下的显示效果,加深了字体颜色
  • 《@objc 和 dynamic》Swift 2.0 中使用 @objc 来重命名类型名的技巧只适用于 ASCII 字符了,对此添加了一些说明和讨论。
  • 《多类型和容器》加入了 Set 类型的说明。
  • 《哈希》加入了关于哈希用途和使用时需要注意的说明。
  • 《Protocol Extension》重新审校,修正了一些语句和用词问题。
  • 《AnyClass,元类型和 .self》修正了一处错字。
  • 《JSON》修正了一处代码中的警告。

版本 2.0.1 (2015 年 8 月 25 日)

  • 本书第二版根据 Swift 2.0 内容进行了大幅更新和调整,更多的更改内容请参见 2.0.0 的 Release Note

2.0.1 根据 Xcode 7 beta 6 的改动对部分内容进行了更新。

  • 《多元组》删掉了最后的说明,因为在 Swift 2.0 中已经不再适用。
  • 《可变参数函数》Xcode 7 beta 6 中可变参数可以在函数中的任意位置,而不一定要是最后一个参数位置了。另外增加了相应的示例代码。
  • 《String 还是 NSString》修正了一处代码错误,Xcode 7 beta 6 中 advance 方法已经被 advancedBy 替代了。
  • 《... 和 ..<》中 print 方法的签名发生了变化,更新了对应的示例代码。
  • 《lazy 修饰符和 lazy 方法》lazy 在 Xcode 7 beta 6 中已经是一个 protocol extension 方法而不再是全局方法了,因此调整了代码使其符合要求。
  • 《闭包歧义》中省略闭包参数类型的写法现在一律被推断为 Any,这应该是一个编译器的 bug。增加了相关说明,我之后会对此继续关注并再次进行更新。
  • 《错误和异常处理》添加了关于 try!try?rethrows 的讨论以及对应的示例代码。
  • 修正了一些章节的错别字。

2.0.0 (2015 年 8 月 24 日)

2.0.0 版本是本书的一个重大更新。根据 Swift 2.0 的内容重新修订了本书,包括对新内容的扩展和过时内容的删除。新版本中对原来的 tips 进行了归类整理,将全书大致分为三个部分,以方便读者阅读查阅。另外,为了阅读效果,对全书的排版和字体等进行了大幅调整。

这一年来随着 Swift 的逐渐变化,书中有不少示例代码的用法已经和现在版本的 Swift 有所区别,因此在这次修订中对所有的代码都在 Swift 2.0 环境下进行了再次的验证和修改。现在本书的所有代码例子已经附在 Swifter.playground 文件中,一并提供给读者进行参考。

新增条目

  • 《Protocol Extension》
  • 《where 和模式匹配》
  • 《错误和异常处理》:代替了原来的错误处理一节。因为 Swift 2 中引入了异常处理的机制,因此现在对于发生错误后如何获取错误信息以及从错误中恢复有了新的方式。原来的内容已经不再适合新版本,因此用新的一节来替代。
  • 《indirect 和嵌套 enum》
  • 《尾递归》

修改和删除

  • 为了表意明确,有特别的理由的个例除外,将其他所有返回 () 的闭包的改写为了返回 Void
  • 《@autoclosure 和 ??》 修正了一处笔误。
  • 《操作符》有几处 Vector2 应为 Vector2D,修正用词错误。
  • 《typealias 和泛型接口》修正一处表述问题,使得句子读起来更通顺。
  • 《Sequence》中 Sequence 相关的全局方法现在已经被写为接口扩展,因此对说明也进行了相应地更改。
  • 《多元组》中有关错误处理的代码已经被异常机制替代,因此选取了一个新的例子来说明如何使用多元组。
  • 《方法参数名称省略》 Swift 2 中已经统一了各 scope 中的方法名称中的参数规则,因此本节已经没有存在的必要,故删去。
  • 《Swift 命令行工具》编译器的命令行工具在输出文件时的参数发生了变化,对此进行修正。另外在运行命令时省去了已经不必要的 xcrun。
  • 《下标》Array 现在的泛型类型占位符变为了 Element,另外原来的 SliceArraySlice 取代了。更新了代码使其能在新版本下正常工作。
  • 《初始化返回 nil》因为 Int 已经有了内建的从 String 进行初始化的方法,因此改变了本节的例程。现在使用一个中文到数字的转换初始化方法来进行说明。
  • 《protocol 组合》修正了示例代码中的错误。
  • 《static 和 class》Swift 2 中已经可以用 static 作为通用修饰,因此修改了一些过时的内容。
  • 《可选接口》中加入了关于使用接口扩展来实现接口方法可选的技巧。因为加入了其他内容,这一节也更名为《可选接口和接口扩展》。
  • 《内存管理,weak 和 unowned》新版本中 Playground 也能正确地反应内存状况以及与 ARC 协同工作了,因此去除了必须在项目中运行的条件,另外修改了代码使它们能在 Playground 中正常工作。
  • 《default 参数》中与参数 # 修饰符相关的内容已经过时,删除。NSLocalizedString 的补全现在也已经改进,所以不再需要说明。
  • 《正则表达式》NSRegularExpression 的初始化方法现在有可能直接抛出异常,使用异常机制重写了本节的示例代码。
  • 《模式匹配》同《正则表达式》,使用异常机制重写了示例代码。
  • 《COpaquePointer 和 C convention》CFunctionPointer 在 Swift 2.0 中被删除,现在 C 方法指针可以直接由 Swift 闭包进行无缝转换。重写了该部分内容,添加了关于 @convention 标注的说明。
  • 《Foundation 框架》在 Swift 2.0 中 StringNSString 的转换已经有了明确的界限,因此本节内容已经过时,故删去。
  • 《GCD 和延时调用》重新说明了 iOS 8 中对 block 的改进。另外由于 Swift 2 中重新引入了 performSelector,对相关内容进行了小幅调整。
  • 《获取对象类型》Swift.Type 现在对于 printdebugPrint 中有了新的实现,进行了补充说明和代码修正。
  • 《类型转换》因为 Objective-C 中对 collection 加入了泛型的支持,现在在 Swift 中使用 Cocoa API 时基本已经不太需要类型转换,故删去。
  • 《局部 scope》添加了关于 do 的说明。Swift 2.0 中加入了 do 关键字,可以作为局部作用域来使用。
  • 《print 和 debugPrint》现在 PrintableDebugPrintable 接口的名称分别改为了 CustomStringConvertibleCustomDebugStringConvertible
  • 《Playground 限制》随着 Apple 对 Playground 的改进和修复,原来的一些限制 (特别是内存管理上的限制) 现在已经不复存在。这一节已经没有太大意义,故删去。
  • 《Swizzle》+load 方法在 Swift 1.2 中已经不能直接被覆盖使用,另外使用 Swift 实现的 +load 方法在运行时也不再被调用,因此需要换为使用 +initialize 来实现方法的交换。改写了代码以使其正常工作,另外加入了关于交换方法选择的说明。
  • 《find》因为引入了 protocol extension,像类似 find 一类作用在 collection 上的全局方法都已经使用 protocol extension 实现了,因此本节移除。
  • 《Reflection 和 Mirror》reflect 方法和 MirrorType 类型现在已经变为 Swift 标准库的私有类型,现在我们需要使用 Mirror 来获取和使用对象的反射。重写了本节的内容以符合 Swift 2.0 中的反射特性和使用方式。另外,为了避免误导,对反射的使用场合也进行了说明。
  • 《文档注释》Swift 2.0 中文档注释的格式发生了变化,因此对本节内容进行了修改已符合新版本的格式要求。
  • 《Options》原来的 RawOptionSetType 在 Swift 2.0 中已经被新的 OptionSetType 替代,现在 Options 有了更简洁的表示方法和运算逻辑。另外加入了 Options 集合运算的内容,以及更新了生成 Options 的代码片段。
  • 《Associated Object》作为 Key 值的变量需要是 Optional 类型,因此对原来不正确的示例代码进行了修改。
  • 《Swift 中的测试》Swift 2 中导入了 @testable,可以让测试 target 访问到导入的 target 的 internal 代码,因此本节的一些讨论过时了。根据 Swift 2.0 的测试方式重写了本节内容。
  • [其他]:修正了一些用词上的不妥和错别字。

版本 1.2.1 (2015 年 2 月 25 日)

  • 《@autoclosure 和 ??》以及其他出现 @autoclosure 的章节中,将 @autoclosure 的位置进行了调整。现在 @autoclosure 作为参数名的修饰,而非参数类型的修饰。
  • 《闭包歧义》] Swift 1.2 中闭包歧义的使用将由编译器给出错误。在保留 Swift 1.1 及之前的讨论的前提下,补充说明了 Swift 1.2 版本以后的闭包歧义的处理和避免策略。
  • 《获取对象类型》删除了过时内容和已经无效的黑科技,补充了 dynamicType 对内建 Swift 类型的用法说明。
  • 《单例》现在可以直接使用类常量/变量,因此更新了推荐的单例写法。
  • 《static 和 class》中更新了类常/变量的用法。
  • 《@UIApplicationMain》中 C_ARGCC_ARGV 分别被 Process.argcProcess.unsafeArgv 替代。
  • 《COpaquePointer 和 CFunctionPointer》更新了一处 API 的参数名。
  • 《类型转换》使用意义明确的 Swift 1.2 版本的 as! 进行强制转换。
  • 《数学和数字》作为补充,添加了 Darwin 中判定 NAN 的方法 isnan
  • 《Swift 命令行工具》中新增了新版本中不需要 xcrun 的说明。
  • 《方法参数名称省略》中的一处 API 的 unwrap 更新。
  • 《C 代码调用和 @asmname》修正了一个头文件引入的错误。

版本 1.2.0 (2015 年 2 月 10 日)

  • 《static 和 class》一节针对 Swift 1.2 进行了更新。Swift 1.2 中 protocol 中定义的“类方法”需要使用 static 而非 class。
  • 《多类型和容器》中的错别字,“不知名”应该为“不指明”。
  • 《内存管理,weak 和 unowned》 中标注例子中标注错误,标注中的逗号应该是冒号。
  • 《Reflection 和 MirrorType》一节代码中遗漏了一个引号。
  • 《Any 和 AnyObject》 修正了一处赋值时的代码警告。

版本 1.1.2 (2014 年 12 月 2 日)

  • 《default 参数》中的错别字,“常亮”应该为“常量”。
  • 《Selector》中示例代码 func aMethod(external paramName: String) { ... }String 应为 AnyObject!,否则会导致程序崩溃(因为 Swift 的原生 String 并没有实现 NSCopying)。
  • 《获取对象类型》 中由于 API 变更,使用 objc_getClass 和 objc runtime 获取对象类型的方法已经不再有效。新的 API 需要与 UnsafePointer 有关,已经超出章节内容,故将该部分内容删除。
  • 《多类型和容器》 中由于 Swift 类型推断和字面量转换的改善,原来的陷阱基本都已经消除,因此本节进行了一些简化,去掉了过时的内容。

版本 1.1.1 (2014 年 11 月 7 日)

  • 《闭包歧义》中的内容在 Swift 1.1 中已经发生了变化,因此重写了这一节。
  • 将代码示例中的 toRaw()fromRaw() 按照 Swift 1.1 的语法改为了 rawValue 和对应的 init 方法。

版本 1.1.0 (2014 年 10 月 21 日)

针对 Xcode 6.1 和 Swift 1.1 的更新。

  • 《属性访问控制》中“Swift 中的 swift 和其他大部分语言不太一样” 应为 “Swift 中的 private 和其他大部分语言不太一样”
  • 《代码组织和 Framework》中 “开发中我们所使以的第三方框” 改为 “开发中我们所使用的第三方框”
  • 《方法名称参数省略》中 “使用自动覆盖的方式” 应为 “使用原子写入的方式”
  • 《内存管理,weak 和 unowned》中对 unowed 的表述不当,进行了修正
  • 《字面量转换》的内容完全重写,更新为适应 Swift 1.1 版本。
  • 《Any 和 AnyObject》一节作出修正,Any 现在可以支持方法类型了。
  • 《初始化返回 nil》一节作出修正,在本书 1.0.1 版本的基础上,进一步更改了部分内容的表述,使其更适应 Swift 1.1 中关于可失败的初始化方法的修改。

版本 1.0.1 (2014 年 9 月 25 日)

  • 《多类型和容器》中在 let mixed: [Printable] 处有个字面量转换的小陷阱,在是否导入 Foundation 时存在一个有趣的差别,对这部分进行了一定补充说明;
  • 《将 protocol 的方法声明为 mutating》中 blueColor()! -> blueColor()blueColor() 返回的已经是 UIColor 而不是 UIColor?
  • 《typealias 和泛型接口》中有误字 “wei”,删除;
  • 《Optional Chaining 文字错误》 它们的等价的 -> 它们是等价的;
  • 《Swift 命令行工具》中示例代码 xcrun swift MyClass.swift main.swift 应当为 xcrun swiftc MyClass.swift main.swift;
  • 《内存管理,weak和unowned》笔误,“变量一定需要时 Optional 值” 中 “时” 应当为 “是”。

版本 1.0.0 (2014 年 9 月 19 日)