作者:Andyy Hope,原文链接,原文日期:2016-01-24
译者:jseanj;校对:saitjr;定稿:CMB

几周前,我无意发现 Guille Gonzalez 写的一篇文章,介绍了如何用协议和扩展让 UITableViewCell 的注册和重用更安全。

看完这篇文章后我非常惊叹,因为不需要依赖继承,只需要协议扩展和泛型就可以非常容易的实现自定义的行为。自从 WWDC15,我们已经听到关于 Swift 如何是一门面向协议的语言,而我只是一知半解,如果你懂我的意思的话。而就在此时我终于明白他们在讲的是什么了。

在我花费大量时间做的应用中有一个大的 storyboard,使用起来令人难以置信的繁琐,所以我最后决定将它分离开。将一个巨大的 UIStoryboard 分成众多小的 UIStoryboard,然后我只需要在我的代码中用不同的字符串去实例化 UIStoryboard,但是这样从来不安全。

阅读全文

作者:Natasha The Robot,原文链接,原文日期:2016/05/25
译者:haolloyin;校对:saitjr;定稿:CMB

有条传播得很广的 tweet 讲到用位置参数(positional references)来初始化 Swift 常量:

原始代码见这个 gist(译注:原 gist 代码缩进太乱,搬运过来整理如下):

import UIKit
import XCPlayground

class ViewController: UIViewController {
func action() { print("Bing!") }

override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .whiteColor()

let mySwitch : UISwitch = {
view.addSubview($0)
CenterViewInSuperview($0, horizontal: true, vertical: true)
$0.addTarget(self, action: "action", forControlEvents: .TouchUpInside)
return $0
}(UISwitch())

let _ : UILabel = {
view.addSubview($0)
CenterViewInSuperview($0, horizontal: true, vertical: false)
$0.text = "Toggle me"
$0.font = UIFont.boldSystemFontOfSize(36)
ConstrainViews("V:[view1]-30-[view2]", views: $0, mySwitch)
return $0
}(UILabel())
}
}

ViewController()
XCPlaygroundPage.currentPage.liveView = ViewController()
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

由于这条 tweet 太简短,而且没有像我预期的那样运作,这让我很困惑。因此我想在这儿写一篇关于这个问题更详细的文章。

阅读全文

作者:Ole Begemann,原文链接,原文日期:2016-07-28
译者:粉红星云;校对:saitjr;定稿:CMB

文章更新日志:

  • 2016/06/30 增加了一个“不足之处”小节,主要关于语法冗长。还有很少一部分内容的重写。
  • 2016/08/02 把代码更新到 Xcode 8 beta 4 版本的。

这个系列的其他文章:

  1. 在 Foundation 框架中的度量值和单位(本篇文章)
  2. 乘法和除法
  3. 改良
  4. 幽灵类型 (Phantom Types)

在 iOS 10 和 macOS 10.12 里的 Foundation 框架,新出了一系列将度量单位模型化的类型,我们在现实中真实使用的度量单位,比如:1 千米,21 摄氏度。如果你还没了解过这个,看看 WWDC session 238 吧,这里概述讲的挺好的。

阅读全文

作者:Natasha The Robot,原文链接,原文日期:2016-07-28
译者:jseanj;校对:saitjr;定稿:CMB

最近我做了一个关于带有关联类型的协议(PATs, Protocols with Associated Types)的演讲,我本来还觉得观众对这个已经耳熟能详了,但事实却相反。

很多人并不知道 PATs 是什么——这我应该预料到的,因为我自学就用了一段时间。因此我想当面讲解下,尤其是这些东西比较难理解,而且我也没能找到很好的解释。

Gwendolyn Weston 在东京 try! Swift 大会上给出的解释对我很有帮助(视频在这)。因此文中的示例是受她的演讲启发。Pokemon 将会出现…

阅读全文

作者:JOE,原文链接,原文日期:2016-05-01
译者:ckitakishi;校对:mmoaay;定稿:CMB

当前,有许多人正在努力将 Swift 3.0 引入到基于 ARM 的系统中。通过本文你将了解如何在运行 Ubuntu 16 (Xenial Xerus) 的树莓派 2 或树莓派 3 上构建并使用 Swift 3.0。不过,我们暂时还没有对它在 Raspbian 系统上的可用性进行测试 (看起来并不可以)。

一个善意的提醒:树莓派 (以及所有 ARM 设备) 所支持的 Swift 3.0 仍然是测试版。 因此,尽管你可以在原型制作以及概念验证时尽情使用,但利用它来构筑产品还需三思。另外,我们有一个团队,正以在 ARM 设备上使用 Swift 3.0 为目标而不懈努力,如果你有兴趣加入,请发邮件到:admin@iachieved.it,我们将会邀请你加入 Slack 群组。

阅读全文

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

Chris Lattner 写了一篇文章:回顾 Swift 3,展望 Switf 4,以下是这篇文章的关键内容:

  • 开源大有益处,但无法让所有人满意。

  • Swift 3 将在 2016 年秋到来。Swift 3.x 会在 2017 年春公布,Swift 4 会在 2017 年秋发布,这其中不包括修复 bug、提升兼容性之类的小更新(例如 3.0.1)。

  • Swift 4 在交付时一定会保障代码的稳定性,增加容错性、ABI,优化泛型与字符串等等。

  • 语法糖的优先级最低,没有提上日程。

  • 安排进度有些困难。开发的目标并非是对交付的保证。从一开始安排计划与进度就是最主要的事。

阅读全文

作者:GABRIEL THEODOROPOULOS,原文链接,原文日期:2016-07-16
译者:冬瓜;校对:saitjr;定稿:CMB

每个开发者在开发一个 app 时,为了优化用户体验,会使用多种颜色和多个图片。但纯色的表现力有一定的局限,有时候使用渐变色能够带来更棒的体验。我曾经做过一些渐变色,我觉得应该将我的经验和大家分享一下。有许多值得学习的技巧。

阅读全文

作者:Natasha The Robot,原文链接,原文日期:2016-05-01
译者:Channe;校对:walkingway;定稿:CMB

Swift 2.2 不允许在协议声明时提供默认参数。如果你想使用协议抽象出 App 中的日志代码,就会面临一个问题。因为默认参数通常用来将源代码位置传递给日志函数。不过,你可以在协议扩展中使用默认参数,这是一个变通方案。

一个典型的日志消息应该包括日志事件的源代码位置(文件名、行号和可能的函数名)。Swift 为此提供了 #file#line#column#function 调试标识。在编译时,解析器将这些占位符展开为字符串或用来描述当前源代码位置的整数字面量。如果我们在每次调用日志函数时都包含这些参数,那重复的次数太多,所以它们通常都是作为默认参数传递。这里之所以可行是因为编译器足够聪明,能够在评估默认参数列表时将调试标识扩展到函数调用处。标准库中的 assert 函数就是一个例子,它这样声明:

func assert(
@autoclosure condition: ()
-> Bool,

@autoclosure _ message: () -> String = default,
file: StaticString = #file,
line: UInt = #line)

第三个和第四个参数默认扩展为调用者源代码的位置。(如果你对 @autoclosure 属性有疑问,它把一个表达式封装为一个闭包,有效地将表达式的执行从调用处延迟到函数体执行时,即闭包表达式在明确使用时才会执行。assert 只在调试构建时使用它来执行 condition 参数的计算(可能代价高昂或者有副作用),同时只在断言失败时才计算 message 参数。)

阅读全文

作者:Olivier Halligon,原文链接,原文日期:2016-07-25
译者:walkingway;校对:小锅;定稿:CMB

尽管现在已经是 ARC 的天下了,但对于程序员来说理解内存管理和对象的生命周期依然是一门必修课。对于在 Swift 当中广泛应用的闭包就是其中一个特殊的例子,与 Objc 的闭包相比,Swift 的闭包也有着不同的捕获语义。下面让我们看看闭包是如何工作的。

阅读全文

作者:Erica Sadun,原文链接,原文日期:2016/08/08
译者:Cwift;校对:Cee;定稿:CMB

k 给我留言:「能在 setter 方法中调用父类么?比如在赋新值时复写 setter,而是调用其父类的方法?」

答案是当然可以。请看示例:

class Foo {
var value: String
init(value: String) { self.value = value }
}

class SubFoo: Foo {
override var value: String {
get { return super.value }
set { super.value = newValue.lowercased()
}
}
}

阅读全文

作者:Soroush Khanlou,原文链接,原文日期:2016-04-08
译者:Lanford3_3;校对:pmst;定稿:CMB

使用 Swift 解析 JSON 是件很痛苦的事。你必须考虑多个方面:可选类性、类型转换、基本类型(primitive types)、构造类型(constructed types)(其构造器返回结果也是可选类型)、字符串类型的键(key)以及其他一大堆问题。

对于强类型(well-typed)的 Swift 来说,其实更适合使用一种强类型的有线格式(wire format)。在我的下一个项目中,我将会选择使用 Google 的 protocol buffers这篇文章说明了它的好处)。我希望在得到更多经验后,写篇文章说说它和 Swift 配合起来有多么好用。但目前这篇文章主要是关于如何解析 JSON 数据 —— 一种被最广泛使用的有线格式。

阅读全文

作者:GABRIEL THEODOROPOULOS,原文链接,原文日期:2016-7-10
译者:X140Yu;校对:saitjr;定稿:CMB

你是否曾经遇到过「使用 app 中的内容生成 PDF 文件」这样的需求?如果你之前没有做过,那你有想过该如何实现吗?

好吧,通过抛出问题来开篇有点不太好,但上述内容总结了我将要在这篇文章中讨论的事情。要在 iOS 应用内创建一个 PDF 文档,看起来像不是一个容易的需求,但事实并不是这样。作为开发人员,你必须要随机应变,为自己创造可供选择的方案,尽量达到目标。这是件很有挑战性的事情。确实,手动绘制 PDF 是一个非常痛苦的过程(取决于内容),最终可能会变得非常低效。计算坐标、加线、设置颜色、缩进、偏移等。这可能很有趣(或并不是),但如果你要绘制的内容非常复杂,那到最后可能会变得一团糟。

阅读全文

作者:radex.io,原文链接,原文日期:2016-07-28
译者:ckitakishi;校对:Channe;定稿:CMB

作为一名 iOS 开发者,你一定对 iOS 10 带来的新特性感到无比兴奋,并迫不及待地想要在应用中实践。虽然你想马上就动手以便第一时间就能“上车”。但 iOS 10 正式上线却是几个月以后的事情,在那之前,你不得不保持每几周就为应用发布一个新版本的频率。这个情况听起来是不是跟你现在的处境很像呢?

当然,目前你还不能用 Xcode 8 来编译需要发布的应用——因为它无法通过 App Store 的验证。所以你需要把项目拆分成两个分支,稳定分支和 iOS 10 开发分支……

而不可避免地是,这烂透了。如果只是暂时在分支上做一点某个特性的开发并无伤大雅。但是随着整个代码库的改变,主分支的演进,持续好几个月来维护这样一个庞大的分支的时候,你就会渐渐遇到一些不可描述的合并之痛。我的意思是,你尝试过处理 .xcodeproj 文件的合并冲突么?

这篇文章的目的就是告诉你如何彻底避免使用分支。对于大部分应用而言,只用一个工程文件就同时支持 iOS 9(Xcode 7)和 iOS 10(Xcode 8)是完全可能的。而且即使你不得不使用分支,这些小技巧也可以帮助你减少两个分支之间的差异,从而更舒服地对它们进行同步。

阅读全文

作者:Russ Bishop,原文链接,原文日期:2016-05-12
译者:pmst;校对:walkingway;定稿:CMB

今天,我想尝试封装 Float32 类型数据到 SQLite 二进制大对象⌈Binary Large Object (BLOB)⌋ 组中。当然,我可以使用 JSON,protobuf,或是其他一些编码方式。除此之外,NSNumberNSArrayNSCoder 和 plist 文件也是不错的选择。

不过,我希望以更加 Swift 的方式来实现,有点类似 C 语言风格,实现迅速且不会引入任何相关性,解码器(decoder)也非常简单,可以在任何平台上实现。

阅读全文

作者:AppCoda,原文链接,原文日期:2015-12-22
译者:BigbigChai;校对:walkingway;定稿:CMB

每一代 iOS 都会为全球的开发者们带来新鲜的“小玩意儿”和对现有技术进行提升。显然,最新的 iOS 9 也不例外,开发者们拥有了全新的框架和 APIs 以方便调用、这可以显著地提升应用程序的水平。Core Spotlight 框架就是其中之一,它包含了许多优秀 APIs,开发者可以很方便地应用在工程中。

Core Spotlight(CS)框架属于一个更大的 API 集合 Search APIs,它让开发者们可以地将应用变得更容易被发现,以及访问起来更加便利。这在以前的 iOS 版本里是不可想象的。Search APIs 让用户和应用之间的联系更加紧密。用户可以更迅速地访问应用,同时应用也能更主动及时地响应用户。除 Core Spotlight 以外,iOS 9 其他新的搜索功能还包括(仅供参考):

  1. NSUserActivity 类的新方法和属性(负责保存应用的状态以便稍后恢复)。
  2. web markup 让网页的内容在设备上可被搜索。
  3. universal links 允许从网页内容里的链接直接打开应用。

我们不会在这篇文章里讨论以上三项,但会详细地介绍 Core Spotlight 框架。但开始之前,我们先来搞清楚这个框架的用途。

Core Spotlight 框架让应用里的数据在 Spotlight 可搜索,然后把与应用相关的搜索结果与系统返回的其他结果一同展示出来。这令人印象深刻并具有革命性,因为这是用户首次可以搜索到除 Apple 官方应用外、任意应用中的数据,然后与之进行交互。用户可以与自定义应用的相关搜索结果进行交互的意思是:不但在搜索结果项被选中时会自动启动应用,而且开发者们也能引导用户跳转到特定视图控制器,用来展示 Spotlight 中被选择的数据。

从开发者的角度看来,集成 Core Spotlight 框架和使用它的 API 并不复杂。正如本教程随后会介绍的那样,只需要几行代码就能搞定。整个过程的重点在于开发者需要“请求” iOS 去索引他们应用里的数据,并且这些数据必须预先以特定的方式来表示。

鉴于这是一篇关于 Core Spotlight 框架的教程,我不打算在简介部分过于详细。如果你有兴趣学习如何实现一些我个人觉得非常棒的功能,那么请继续阅读。我相信,当你读完之后,就能很轻松地让你的应用支持 Spotlight 搜索。

阅读全文

作者:iAchieved.it,原文链接,原文日期:2016-06-2
译者:pucca601;校对:靛青K;定稿:CMB

有许多小伙伴对在他们的树莓派 3 上构建 Swift 3.0 感兴趣,这篇教程献给那些勇敢的灵魂!

在开始之前你需要准备好以下东西:

显然这是可以做到的;而且我们已经做到了,并且还有其他小伙伴也对基于 ARM 的设备上构建 Swift 程序作出了贡献。所以别放弃。不过就算你放弃了我们也不会说什么,直接下载我们的 prebuilt Swift 3.0 package for the Raspberry Pi 2 and 3 吧。

阅读全文