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

作者: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-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) 生成的选项的地位是平等的。

阅读全文