作者: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> 那样来封装类型的信息。

阅读全文

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

在 Swift 3 指导手册中,我们将聚焦如何帮助初学者从一个完完全全的新手到基本掌握 Swift 。这里会使用 Swift 3 来教学。我们编写这个指导的初衷是因为市面上的很多指导手册都已过时了,因此它就不适合仅仅以“ Swift3 有哪些新功能”来行文。我们找了几位有多门语言的编程经验的人士,来教你 Swift 语言的独特性以及如何用好它。

阅读全文

作者:Gabriel Theodoropoulos,原文链接,原文日期:2016-10-16
译者:Cwift;校对:walkingway;定稿:CMB

在一款应用中,操作数据库和处理数据通常都是一个重要而且关键的部分。几个月前我所写的一篇文章曾经谈到过这个话题,那篇文章讲解了如何使用 SwiftyDB 来管理 SQLite 数据库。我今天再来探讨数据库的话题,不过这次我要介绍另一个你可能已经知道的库:FMDB

阅读全文

作者:Arthur Knopper,原文链接,原文日期:2016-05-26
译者:Crystal Sun;校对:星夜暮晨;定稿:CMB

通常情况下,iPhone 屏幕首页上会展示 App 的默认名称。但有时候,我们需更改此名称。在本节教程中,我们会借助属性列表项(property list item)来改变 App 的展示名称。本节教程使用的是 Xcode 7.3.1 和 iOS 9.3。

阅读全文

作者:Arthur Knopper,原文链接,原文日期:2016-10-18
译者:冬瓜;校对:星夜暮晨;定稿:CMB

Core Graphics 是一套非常强大的底层 API 接口集合。在这篇教程中,我们将借助 Core Graphics 来创建渐变颜色。出于简便起见,我们将创建线性渐变 (linear gradients)。所谓线性渐变,是从一个点到另外一个点颜色过渡的描述。我们将会创建一个从左向右渐变的视图。该教程的实验环境是 Xcode 8 和 iOS 10。

阅读全文

作者:Arthur Knopper,原文链接,原文日期:2016-10-11
译者:Crystal Sun;校对:星夜暮晨;定稿:CMB

当用户没有在前台使用某 App 的时候,通过本地通知(Local Notification)可以将消息推送给用户。iOS 10 里苹果公司引入了多信息通知 (rich notifications),其中可以包含不同类型的媒体内容。在本节教程中,我们将创建一个本地通知,其中包含了一个图片消息。本节教程使用的是 Xcode 8 和 iOS 10。

阅读全文

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

在进行完 GYP 预处理后,阅读 Swift 标准库源码的最简单的一种方式是执行一次完整的 Swift 编译。(另一种是写一小段 shell 脚本。可以看下面的更新)

如果你想要开始阅读 Swift 源码,那它的标准库应该是首先开始阅读的地方。标准库中的代码是和每一个使用 Swift 的开发者都息息相关的,如果你也曾经对某个 API 的表现和性能有过怀疑,那么直接阅读对应的源码会是解决问题最快的方式。

标准库也是 Swift 项目中最容易接触的地方。其中一点理由是,它由 Swift 写的,而不是 C++。因为你每天都用它,所以对它的 API 也非常熟悉。这就意味着,在源码中找到你想要的那段代码不是特别困难。如果你只是没有目标随便看看,那么在源码中你可能会发现或者这块金子。

阅读全文

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

我在前面的文章中提到过,Swift 中有两个基础的区间(Range)类型:RangeClosedRange,并且这两个类型不能互相转换。这使得编写一个同时适用于两种区间类型的函数变得很困难。

昨天,swift-users 的邮件列表中有人问了一个具体的问题:假设你写了一个名为 random 的函数,它接受一个整数的区间,并返回一个该范围中的随机值:

import Darwin //在 Linux 上也可以用 Glibc

func random(from range: Range<Int>) -> Int {
let distance = range.upperBound - range.lowerBound
let rnd = arc4random_uniform(UInt32(distance))
return range.lowerBound + Int(rnd)
}

你可以使用一个半开的区间调用这个函数:

let random1 = random(from: 1..<10)

但是你不能传入一个闭合的区间:

let random2 = random(from: 1...9) // error

太差劲了,什么是最好的解决方案?

阅读全文

作者:Arthur Knopper,原文链接,原文日期:2016-10-18
译者:Crystal Sun;校对:星夜暮晨;定稿:CMB

Segmented Control 用于展示一些用户可以选择的选项。每个 Segment 看起来像是一个单选按钮 (radio button),用户即便选中了某个选项,这个 Segment 仍保持“选中”状态。在本节教程里,我们会在 UISegmentedController 当中创建两个 Segment,每个 Segment 会让 Label 显示不同的文本内容。本节教程将使用 Xcode 8 和 iOS 10 来进行构建。

阅读全文