Hi,SwiftGG 翻译组启用了新的域名:swiftgg.team今后翻译组的各项活动将会在新域名下开展,不要错过哦!

作者: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 吧。

阅读全文

作者:Natasha The Robot,原文链接,原文日期:2016-07-25
译者:Lanford3_3;校对:千叶知风;定稿:CMB

上周我出席了 iOSDevCampDC,并有幸参加了 @ayanonagon 关于测试的演讲,你们可以到这儿获取样例代码。

让我惊讶的是,出于测试的目的,她为一个协议(protocol)实现了默认的 Equatable,类似这样:

protocol Rectangle: Equatable {
var width: Double { get }
var height: Double { get }
}

// 所有遵循这个协议的对象
// 现在都有了基于协议属性的默认相等性判断
func ==<T: Rectangle>(lhs: T, rhs: T) -> Bool {
return lhs.width == rhs.width &&
rhs.height == lhs.height
}

之所以说让我感到惊讶,是因为我从未想过让遵循某个协议的所有对象都拥有一个像这样的默认实现。这确确实实地让我陷入了思考!当然,对于 Ayaka 的例子来说这样做很合理——她完全是出于测试的目的添加了这样的代码。

阅读全文

作者:Andyy Hope,原文链接,原文日期:2016-04-21
译者:Darren;校对:Cee;定稿:CMB

如果说 log 是一种时尚,那你就是时尚设计师。

我本来没打算写这个系列的第三部分的,但是在前两部分的读者的回复中我得到了一些反馈信息,我觉得看一看人们是怎么建议的是一个很好的阅读和练习的方式。

如果你还没看过前面的部分,你可以回头看看第一部分第二部分

阅读全文

作者:Andyy Hope,原文链接,原文日期:2016-02-23
译者:wiilen;校对:小锅;定稿:CMB

在 2009 年,我第一次下定决心要学习如何开发 App。那时候 iOS 3 才刚刚发布,之后,App Store 就成了那些开发 to-do 列表、笔记记录以及其它无聊应用的开发者们的金矿。

Objective-C 是我决定要全身心投入学习的第一门面向对象的语言,那时候这门语言与现在有很多区别。过去几年我们见证了它的发展,与此同时苹果还发布了令人印象深刻的 Swift 语言。

如今开发者们认为 ARC(自动引用计数)是理所应当的存在,特别是那些在 iOS 5 发布(2011年)之后学习 Objective-C 的人,或是学习 Swift 的人。

阅读全文

作者:Anddy Hope,原文链接,原文日期:2016-04-14
译者:Darren;校对:Cee;定稿:CMB

如果说 Log 是一种时尚,那你就是时尚设计师。

上一篇文章中,我聊到了如何通过在打印的日志中使用 emoji 表情来帮助你从冗杂的信息中减少认知负荷。然而,我给的糟糕的实现并不会让你对在自己的代码中使用 emoji 产生强烈的意愿。

这篇文章我将会实现承诺,告诉你如何使用比 print 函数 稍微 复杂的方法轻量地实现带 emoji 表情的日志。

阅读全文

作者:Soroush Khanlou,原文链接,原文日期:2016-6-27
译者:X140Yu;校对:Crystal Sun;定稿:CMB

有一些刚刚开始编程的人会问我,如何才能从写代码转变成写漂亮的代码,为此,我会推荐一些书,对于刚开始编程的菜鸟来说,这些书非常赞。对于像我这种已经有几年编程经验的老鸟来说,仍能从中学到东西。这些书有很大一部分都是用其他语言如 C、Ruby 或者 Java 写的,读这些书可能是个不小的挑战。还好在大多数情况下,任何编程语言都可以清晰表达编程思想,况且早点培养多语言编程技能也不是一件坏事。

阅读全文