作者:Erica Sadun,原文链接,原文日期:2017-01-24
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

久而久之,Swift 发展出一种别具一格的专用语法——即一组与其他语言相差甚远的基本惯用语法 (core idioms)。许多来自 Objective-C、Ruby、Java、Python 等等语言的开发者纷纷投向 Swift 的麾下。数日前,Nicholas T Chambers 让我帮他来磨练这门新习得的语言。他通过将 Ruby 代码移植为 Swift 的方式,来构建自己基本的编程技能。他所移植的代码是这样的:

阅读全文

作者:Soroush Khanlou,原文链接,原文日期:2017-01-04
译者:Cwift;校对:walkingway;定稿:CMB

当触发网络请求时,通常会引发许多副作用。然而,副作用对于系统的可测试性来说就是一剂毒药,并且可能会因应用程序和请求的不同而出现差异性。如果我们创建一个系统用来容纳这些副作用的组合,就可以提高系统的可测试性和其他特性。

阅读全文

作者:Erica Sadun,原文链接,原文日期:2017-01-31
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

本挑战由 Mike Ash 提供,如下所示,假设有这样一个枚举:

enum Enum {
case foo(Int)
case bar(String)
case qux(Int)
}

这些枚举还组成了的一个数组:

let items: [Enum] = [.foo(1), .bar("hi"), .foo(2)]

需要对数组进行筛选 (filter),挑选并创建只包含某种枚举值 (case) 的新数组。麻烦的是,Swift 没有一种类似 ==~= 的操作符,可以让我们忽略枚举的关联值:

// 不起作用
let filtered = items.filter({ $0 == .foo })

那么应该怎么办呢?

阅读全文

作者:Soroush Khanlou,原文链接,原文日期:2017-01-12
译者:Cwift;校对:walkingway;定稿:CMB

我经常观察一个类型的实例变量,这样我就可以更深入地理解这个类型设计的初衷。一旦你知晓该类型的底层结构,它的用法也就随之浮出水面了。反之亦然:如果你没看过一个对象内部成员的布局情况,那么不可能准确把握该对象的功能。这种情况对于苹果的闭源类型尤其明显。

阅读全文

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

你遇到过这个问题吗?想要在 UI 中显示一个可选值或将其打印到控制台以便调试,但是你不喜欢可选值转成字符串的默认格式:Optional(…)nil。比如:

var someValue: Int? = 5
print("The value is \(someValue)")
// → "The value is Optional(5)"
someValue = nil
print("The value is \(someValue)")
// → "The value is nil"

阅读全文

作者:Ole Begemann,原文链接,原文日期:2017-01-09
译者:Cwift;校对:walkingway;定稿:CMB

Swift Talk episode 31 上,Chris 和 Florian 展示了一种针对 Swift 中可变的嵌套异构字典的解决方案,这种字典是 [String:Any] 类型的。这是一个有趣的讨论,我鼓励你看看原视频或者阅读这篇优秀的文字记录。

我为准备这期对话节目做了点微小的贡献,不过围绕这个问题所进行的一些实验代码视频并没有提到,所以我想在这里展示给你。

阅读全文

作者:Andyy Hope,原文链接,原文日期:2016-04-06
译者:SketchK;校对:Crystal Sun;定稿:CMB

时尚日志,由你做主

自从 Swift 的 beta 版本诞生后,社区里那些富有探索精神的开发者就迫不及待地在 Swift 的学海中遨游,他们不遗余力地去探索 Swift 的潜力,同时交流分享他们从中得到的经验。

此前,在 Twitter 上搜索 Swift,大部分都充斥着关于 Taylor Swift 的搜索结果,以至于我无法从中列举出有用的信息,但搞笑的是,没人知道为什么时至今日,Twitter 上检索到的信息仍是 Taylor Swift(呵呵……)。另一件人们普遍提及到的 Swift 特性便是:Swift 代码现在可以对 Emoji 表情进行处理。

阅读全文

作者:PRANJAL SATIJA,原文链接,原文日期:2016-11-13
译者:TonyHan;校对:Cwift;定稿:CMB

最近 APP 中的地图功能变得越来越流行了。从优步到 Instagram ,再到我的新应用 peek ,地图功能在各种 APP 中都能见到。虽然地图很常见,但是往地图功能添加一些更复杂的功能还是有点挑战的。在这篇文章中,咱们就讨论下在 MapKit 中的大头针和图形渲染,MapKit 是苹果 iOS 系统中的地图库。你在 iOS 系统中看到的许多地图都依赖 MapKit 的强大支撑——当然包括苹果内置地图 APP!MapKit 是一个功能强大、稳定的、健壮的地图库。当然它也很易用,让我们开始吧!

阅读全文

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

当你在想要 大规模重命名 时,一个附带的挑战就是要确保所有相关的文档都必须同步更新。比如,截至到 2016 年 9 月 20 日,DateFormatter 的文档依旧没有与版本统一,引用的是 Swift 2.3 风格的 API(译者注:现在是 2017年,文档依旧没有更新…)。随着时间的推移,这些疏漏毫无疑问都会被纠正,这里是一些使用 Date 以及 DateFormatter 实现的日期格式化的示例。

阅读全文

作者:Simon Ng,原文链接,原文日期:2016-11-02
译者:小锅;校对:saitjr;定稿:CMB

那么,什么是二维码呢?我相信读者中的大多数都知道什么是二维码(译者注:我觉得应该是全部都知道吧)。以防还有读者没有听说过二维码,可以看一下上面这张图片(译者注:原文如此,并且原文中也没有图片)——那就是二维码。

二维(QR 全称是 Quick Response 快速响应)码是一种二维的条形码,它是由 Deson 所发明的。它原本被设计用于跟踪工业生产中的零件,最近几年二维码被用于编码 URL,在消费市场上受来越来越多的欢迎。与你所熟悉的普通条形码不同的是,二维码在横向和纵向上都包含了信息。这赋予了它储存大量数字和字母信息的能力。我并不想在这里深入讨论二维码的技术细节。如果你对这些感兴趣的话,可以参考二维码的官方网站

随着 iPhone 和 Android 手机的流行,二维码的使用率得到了惊人的发展。在某些国家里,二维码几乎无处不在。它们出现在杂志、报纸、广告牌、名片甚至是菜单上。作为一个 iOS 开发者,你可能对于如何使用应用支持二维码扫描感到很好奇。在 iOS 7 之前,为了实现二维码的扫描,我们必须利用第三方库。现在,我们可以直接利用内置的 AVFoundation 框架来实时读入和扫描二维码。

创建一个支持扫描以及翻译二维码的应用从来没这么容易过。

小贴士:可以使用 http://www.qrcode-monkey.com 这个网站来生成属于你自己的二维码。

阅读全文

作者:Arthur Knopper,原文链接,原文日期:2016-07-26
译者:pucca;校对:Cwift;定稿:CMB

本教程使用 NSXMLParser 对象对 xml 文件进行解析。解析结果由 Table View 展示。本教程在 Xcode 7.3.1 上基于 iOS 9.3 构建。
打开 Xcode 并且新建一个单视窗应用。名字就叫 IOS9XMLParserTutorial,组织名字和组织标识自己定。语言选 Swift,设备只选 iPhone。

阅读全文

作者:Andyy Hope,原文链接,原文日期:2016-11-01
译者:Yake;校对:pmst;定稿:CMB

无论是从语言本身还是项目代码,Swift3 的革新无疑是一场“惊天海啸” ,一些读者可能正奋战在代码迁移的前线。但即使有如此之多的改动, Swift 中依旧存在许多基于 Foundation 框架,泛字符串类型的 API 。这些 API 完全没有问题,只是…

我们对这种 API 有一种既爱又恨的感情:偏爱它的灵活性;又恨一时粗心导致问题接踵而来。这简直是在刀尖上编程。

Foundation 框架的开发者们之所以提供泛字符串类型的接口,是考虑到无法准确预见我们未来会如何使用这个框架。这些开发者们极尽自己的智慧、能力和知识,最终决定在某些 API 中使用字符串,这为我们开发人员带来了无尽的可能性,也可以说是一种黑魔法。

阅读全文

作者:Erica Sadun,原文链接,原文日期:2017-01-06
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

让我先阐述一下撰写这篇文章的背景。Laptopmini 想要知道为什么下面这段代码无法完成编译。诚然,Swift 的错误提示尚存有改进的余地。简而言之:他需要将第二行和第三行代码进行互换,才能够完成编译。这就需要让这两个属性在引用 self 之前,完成初始化操作。

阅读全文

作者:Erica Sadun,原文链接,原文日期:2017-01-09
译者:星夜暮晨;校对:Crystal Sun;定稿:CMB

Kyle Cardoza 留言给我:「Erica,当您必须处理指向不同类型的 OpaquePointer 值时,为 OpaquePointer 建立一个别名是否是糟糕的代码风格呢?我觉得类型别名让代码读起来更舒服……」

使用类型别名来创建「假型 (pseudotypes)」(而通常类型别名只会重复表述一个类型),可以用来整齐地组织代码。我赞成任何可以强化语义表述和加强可读性的方案。由于 OpaquePointer 并不是泛型,因此我们没办法像 Array<Int> 或者 Set<String> 那样来封装类型的信息。

阅读全文