作者:Ole Begemann,原文链接,原文日期:2016/10/10
译者:Cwift;校对:walkingway;定稿:CMB

Swift 的闭包分为 逃逸非逃逸 两种。一个接受逃逸闭包作为参数的函数,逃逸闭包(可能)会在函数返回之后才被调用————也就是说,闭包逃离了函数的作用域。

逃逸闭包通常与异步控制流相关联,如下例所示:

  • 一个函数开启了一个后台任务后立即返回,然后通过一个完成回调(completion handler)报告后台任务的结果。
  • 一个视图类把『按钮点击事件执行的操作』封装成一个闭包,并存储为自身的属性。每次用户点击按钮时,都会调用该闭包。闭包会逃离属性的设置器(setter)。
  • 你使用 DispatchQueue.async 在派发队列(dispatch queue)上安排了一个异步执行的任务。这个闭包任务的生命周期会比 async 的作用域活得更长久。

与之对应的 DispatchQueue.sync,它会一直等到任务闭包执行完毕后才返回——闭包永远不会逃逸。map 以及标准库中其他的序列和数组的算法也是非逃逸的。

阅读全文

作者:Ole Begemann,原文链接,原文日期:2016-09-22
译者:BigbigChai;校对:walkingway;定稿:CMB

本文摘自即将出新版的 Swift 进阶(Advanced Swift)一书中的集合协议(Collection Protocols)章节(稍作修改以适合博客文章)。我和 Chris Eidhof 已经基本完成为本书更新到 Swift 3 的工作,很快可以面世。

Swift 中的集合非常强大,但也很复杂。如果你想实现自定义的集合类型,首先需要了解集合协议的原理。即使只是使用标准库中常见的集合类型,它的工作原理仍然十分值得学习,尤其是它可以帮助你理解编译器打印出来的错误信息。

在本文中,我们想探讨一下集合协议的关联类型。这听起来像是一个晦涩的主题,但我认为想要掌握 Swift 中集合类型的关键:在于对理解关联类型的作用、以及为什么需要它们。

阅读全文

作者:Pranjal Satija,原文链接,原文日期:2016-08-16
译者:Cwift;校对:Cee;定稿:CMB

欢迎!这篇文章将教你一项 iOS 中的关键技术:图层(layer)。你可能已经知道了 iOS 中的视图,但你可能不知道每一个独立的视图背后都有称为图层的东西。图层是 Core Animation 框架中的内容。

你也许很好奇,「我从来没有用过一个图层,所以它可能没那么重要吧?」无论你知道与否,你的应用程序都会大量使用图层。不管是什么视图,iOS 上的视图都会包含一个图层。正是因为图层的存在,iOS 可以在你的应用中轻松检测到视图的位图信息,然后提供给设备的 GPU。请参照下面的图片(来自苹果公司),清晰地展示了 Core Animation 在 iOS 层次结构中的位置。

阅读全文

作者:Erica Sadun,原文链接,原文日期:2016-10-07
译者:wiilen;校对:Cee;定稿:CMB

Soroush Khanlou 曾写道:「很多时候我希望可选类型并不存在,“结果” 就只是 “结果”」。

他给了个例子:

struct NilError: Error { }

func throwable<T>( _ block: @autoclosure() -> T?) throws -> T {
guard let result: T = block() else {
throw NilError()
}
return result
}

let image = try throwable(UIImage(data: imageData))

阅读全文

作者:Joe,原文链接,原文日期:2016/09/24
译者:X140Yu;校对:walkingway;定稿:CMB

编者注: 此文是我们上一篇在 BeagleBone Black 或 Raspberry Pi 3 上编译 Swift 3.0 的续篇,这篇文章使用了由 Swift ARM 组织搭建的仓库。

为了在一个 ARMv7 的系统上原生编译 Swift 3.0,你需要做以下准备工作:

  • 一个性能强劲的 ARMv7 设备;我们使用 BeagleBoard X15 编译了大概 4 个小时,在 Raspberry Pi 3 上编译了大概六个小时。
  • 使用 USB3 flash drive 或者 UHS-I/class 10 microSD 之类的高速 IO 存储设备,有 16GB 或以上存储空间(我比较喜欢 Patriot EP Series 这种价格合适,读写速度也不错的产品)
  • 支持编译 Swift 的 Ubuntu 发行版,例如 Ubuntu Xenial 16.04
  • 耐心

阅读全文

作者:Erica Sadun,原文链接,原文日期:2016-08-10
译者:冬瓜;校对:CMB;定稿:CMB

为了找到两个日期之间的时间间隔,需要调用 dateComponents(_:, from: , to:) 方法,并传入你要使用的单位。这个方法将会返回一个 DateComponents 实例,通过 .day 这个成员(property),你可以得知传入的两个日期之间相差的天数。

如果想写一个返回多计量单位的方法来描述两个日前间的间隔时间,无论天数、分钟数、秒数还是年份,应该怎么做呢?

阅读全文

作者:Ole Begemann,原文链接,原文日期:2016/09/28
译者:Lanford3_3;校对:saitjr;定稿:CMB

对于位掩码,Swift 给出的方案是:选项集合(option sets)。在 C 和 Objective-C 中,通常的做法是将一个布尔值选项集合表示为一系列值为 2 的整数次幂的枚举成员。之后就可以使用位掩码来选择想要的选项了。举例来说,NSString 定义了一个名为 NSStringCompareOptions 的枚举以表示字符串比较选项:

阅读全文

作者:Joe,原文链接,原文日期:2016-07-04
译者:粉红星云;校对:shanks;定稿:CMB

这里是在 Linux 上使用 Swift 来编写MQTT客户端系列的一篇文章。

在这篇文章里,我们将着眼在 MQTT遗愿消息。一般是连接着代理程序的客户端预定义好 LWT(Last Will and Testament)的。如果客户端异常地断开连接,代理程序(the broker)将会广播 LWT 消息到所有订阅者的客户端中。

阅读全文

作者:Joe,原文链接,原文日期:2016/04/12
译者:Cwift;校对:walkingway;定稿:CMB

移动应用分析是指捕获并分析用户在使用应用时产生的用户行为。当然,完整的应用分析包括了操作系统、桌面应用、web应用等等,移动应用分析只是其中的一个分支。直到今年早些时候,Parse 还是一个流行的云平台,用于捕获和显示移动应用程序的使用数据。

从 Prase 的突然离开给我们上了一课。首先,对于从事软件开发超过一年的人来说,不应该感到奇怪,没有什么是永恒的。所以,事情发生了改变。第二个教训可能是,你曾经经历过因为平台不断改动引发的愤怒(或者疼痛),那么为什么不抽象出一些底层的操作,并且让这些操作在将来更容易被更改呢?我们已经从前人的经验中学习,准备应用到移动分析上,让应用更加的“面向未来”。

阅读全文

作者:Soroush Khanlou,原文链接,原文日期:2016-09-27
译者:saitjr;校对:CMB;定稿:CMB

可以说 Swift 是 Objective-C 的后继之人,毕竟也算是师出同门。但是他们语法看来不像,用起来也不像,给人的感觉也不一样。有些在 Objective-C 上用得好端端的案例,在 Swift 上却看起来怪怪的,如方法命名。在 Objective-C 中,方法名尽量完整:

[string dataUsingEncoding:NSUTF8StringEncoding];

在 Swift 2.2 中,这样调用看着就没那么优雅:

string.dataUsingEncoding(NSUTF8StringEncoding)

在 Swift 3 中,这个方法看起来就顺眼多了:

string.data(using: .utf8)

所以,像 Swift 3 中这样的命名方式,才是 Swift 的正确姿势。而 Objective-C 的方式也只适用于 Objective-C。我觉得这篇文章应该能帮你在新世界中修炼你的方法命名习惯。

阅读全文

作者:Ole Begemann,原文链接,原文日期:2016-08-29
译者:与狼同行;校对:Cwift;定稿:CMB

本系列其他文章:

(1) Measurements 和 Units 概览
(2) 乘法和除法
(3) 内容提炼
(4) 幽灵类型(本文)

我之前撰写了关于标准库里新的度量值的短系列,此文是该系列的额外之作。虽然我很喜欢苹果的 API ,但我觉得探索同一问题的不同解决方案也很有意思。特别是这个问题,纯 Swift 设计是否能优于苹果的接口呢,因为苹果的接口考虑了 Objective-C 的兼容性问题

阅读全文

作者:Joe,原文链接,原文日期:2016-09-24
译者:shanks;校对:walkingway;定稿:CMB

如果你阅读过本主其他的 Swift 文章,你会发现我们是 Swift 服务器端开发的忠实拥护者。
今天我们将继续研究这个主题,使用 Vapor 封装的 MySQL wrapper 来操作 MySQL 数据库。

说明:这并不是一篇介绍 MySQL 或 SQL 的文章,如果你对数据库还不熟悉,网上有大量的教程可供学习。本篇我们将焦聚在 Linux 上使用 Swift 3.0 来操作 MySQL 数据库。

阅读全文

作者:Terhechte,原文链接,原文日期:2016/07/15
译者:BigbigChai;校对:way;定稿:千叶知风

Swift 3 : 从 NSData 到 Data 的转变

Swift 3 带来了许多大大小小的变化。其中一个是为常见的 Foundation 引用类型(例如将 NSData 封装成 Data ,将 NSDate 封装成 Date)添加值类型的封装。这些新类型除了改变了内存行为和名字以外,在方法上也与对应的引用类型有所区别 1。 从更换新方法名这类小改动,到完全去掉某一功能这种大改动,我们需要一些时间去适应这些新的值类型。本文会重点介绍作为值类型的 Data 是如何封装 NSData 的。

阅读全文

作者:Tikitu de Jager,原文链接,原文日期:2015-10-31
译者:Darren;校对:Cee;定稿:CMB

好吧,其实我标题党了:Swift 扩展只能添加计算属性。然而如果你愿意用 Objective-C 的关联对象,你可以在 Swift 中做一些同样有趣的事。有很多的模板可供选择,然而如果你用这些太过显然的方式,你也就牺牲了类型安全。我们可以做得更好吗?

阅读全文

作者:Russ Bishop,原文链接,原文日期:2015-01-05
译者:靛青K;校对:shanks;定稿:CMB

我想要一个关联类型的圣诞礼物

关联类型系列文章

有时候我认为类型理论是故意弄的很复杂,以及所有的那些函数式编程追随者都只是胡说八道,仿佛他们理解了其中的含义。真的吗?你有一篇 5000 字的博客是写关于插入随机类型理论概念的吗?毫无疑问的没有。a)为什么有人会关心这些以及b)通过这个高大上的概念能帮我们解决什么问题?我想把你装进麻布袋里,扔进河里,并且砸进一个里。

我们在讨论什么?当然,关联类型。

当我第一次看到 Swift 范型的实现时,关联类型 的用法的出现,让我感到很奇怪。

在这篇文章,我将通过类型概念和一些实践经验,这几乎都是我用自己的思考尝试解释这些概念(如果我犯了错误,请告诉我)。

阅读全文

作者:Jameson Quave,原文链接,原文日期:2016-08-10
译者:Joy;校对:bestswifter;定稿:千叶知风

我想要分享一段来自 Swift 开发者的简短对话,KS Sreeram 写到:

我试图通过下面几步,通过最少的数据复制,高效地创建一个字节数组

  1. 创建一个空的字节数组。
  2. 在数组中预留充足的空间。
  3. 使用可变指针去做数组的数据填充。
  4. 只有数组被填充之后,才能知道它的实际大小。
  5. 我想要设置数组的大小为它被填充的实际大小。

我还没有找到任何有效的方法去完成最后一步。有办法去这么做吗?

阅读全文

作者:SAHAND EDRISIAN,原文链接,原文日期:2016-08-09
译者:ckitakishi;校对:mmoaay;定稿:CMB

在 2016 年的 WWDC 上,Apple 介绍了一个十分有用的语音识别 API,那就是 Speech 框架。事实上,Siri 的语音识别正是由 Speech Kit 提供支持。就目前来说,可用的语音识别框架并非没有,但是它们要么太贵,要么不够好。在本教程中,我将会向你演示如何使用 Speech Kit 来创建一个像 Siri 一样的应用来进行语音到文本的转换。

阅读全文

作者:Ole Begemann,原文链接,原文日期:2016/07/29
译者:钟颖;校对:小铁匠Linus;定稿:CMB

更新:
2016-08-02 已将代码更新至 Xcode 8 Beta 4

本系列其他文章:

(1) Measurements 和 Units 概览

(2) 乘法和除法

(3) 内容提炼(本文)

(4) 幽灵类型

Swift 中 Measurements 和 Units 的系列文章中,仍然有一些收尾工作要做。如果你还没有看过之前的文章的话,可以在第一部分中找到 Foundation 框架中 Measurements 和 Units 接口的大致介绍,并在第二部分中看到我如何扩展该系统用于类型安全的乘法和除法。

阅读全文