作者: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 来进行构建。

阅读全文

作者:Natasha The Robot,原文链接,原文日期:2016-09-26
译者:saitjr;校对:小锅;定稿:CMB

目前为止,watchOS 的复用性都不是很好。即使每个界面都差不多,你也不得不在 storyboard 中把所有 Interface Controller 拖出来,就像下面这个 Italian Food 应用一样:



每个 Interface Controller 简单到就只有一个 image 和 label:

即使它们的界面,甚至逻辑都完全一样,在此之前,我都没找到重用这些 Interface Controller 的方法!

所以我有三个不同的 controller,而它们的代码,除了 image 和 label 的数据模型外,其它的我都复制粘贴的。在我坚持不懈下,终于发现了个黑魔法,虽然有点恶心,不过能解决问题倒是真的。

阅读全文

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

通常情况下,我更倾向于将 OptionSets 视为一种类型,可惜它们并不是。

public protocol OptionSet : SetAlgebra, RawRepresentable

目前的 OptionSets 是通过协议的方式来实现的,从而使得未来相关 API 的持续演进成为可能。正如 Joe Groff 所指出:开发者可以将单个选项分解为多个精简的选项,与此同时仍然保留提供原始选项的能力。您可以在下面的例子当中看到相应的实现,其组合出了 energyStargentleStar 选项,而它们与那些使用移位标志 (bit-shifted flags) 生成的选项的地位是平等的。

阅读全文

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

CocoaPods 是一个面向 Xcode 的项目依赖管理工具。当需要向项目添加库和框架时,它是一项极其有用且值得选择的服务。

试想一下,有人开发了一个足以改变游戏规则、且具有划时代意义的库,并想把它分享给这个世界。这时候该怎么办?长话短说,我要说的是你需要知道如何发布自己的 CocoaPod!

阅读全文

作者:Umberto Raimondi,原文链接,原文日期:2016-04-07
译者:shanks;校对:pmst;定稿:CMB

从 Swift 开源到现在,只有短短的几个月时间,Swift 却已经被移植到了许多新的平台上,还有一些新的项目已经使用了 Swift。这类移植,每个月都在发生着。

在不同平台下混合使用 Swift 和 C 的可行性,看起来是一件非常难的实践,只有非常有限的实践资源,当然这是和你去封装一个原生库对比起来看的,你可以在你代码运行的平台上轻松地封装一个原生库。

阅读全文

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

昨天,一位名叫安德鲁·华纳的开发者撰写的这篇文章引起了一些争论。文章标题“警惕注释的‘塞壬之歌’”(译者注:塞壬是希腊神话中的海妖,她的歌声极具迷惑性,会引起海啸等灾难)暗示了开发人员在自欺欺人,因为注释会降低代码的质量:

注释在腐烂。它们不会被编译,并且永远不会在运行时被执行。如果注释过时或者不正确,测试不会因此而失败,也没有用户会抱怨。和注释打交道的程序员担心“有人可能需要这个注释,或者该注释会对将来的开发带来帮助”,所以在注释真正有用之前就在代码中引入了很多注释(甚至你还得先证明它们的确是有用的)。

他的建议是什么呢?

阅读全文

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

不久之前,Iain Delaney 给我发了这一幅图:

这幅由 Steve Luscher 设计的图,其内容来源于 Joey Devilla 的博客 Global Nerdy 中的一篇文章。我觉得这种做法相当有才,让人眼前一亮。

然而,这幅图不是用 Swift 编写的,显然没办法在 Swift 中运行。我决定娱乐一番:我建立了一个 Playground,将大量的 Emoji 字符分配到对应的 Emoji 变量当中,由此构建了一个庞大的列表,然后使用 Swift 的语法让这些例子能够正确运行。

阅读全文

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

sssilver 留言说:「我发现我司的代码普遍都是这种情况:每个类都包含了一堆的静态方法。我问同事为什么不直接编写方法,他们回答说是不想污染命名空间。在类似 Rust 之类的语言当中,所有内容都位于模块内部。那么在 Swift 当中常见的做法是如何呢?」

阅读全文