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

作者:Joe,原文链接,原文日期:2016-01-23
译者:DianQK;校对:numbbbbb;定稿:Cee

2016 年 2 月 26 日更新swiftlogmaster 分支已经更新至 Swift 3.0 版本。

Swift 2.2 Swift 3.0 License ISC

Apple 发布 Swift 不久,就有大量的开发者提供了日志静态库,但 Lumberjack 这样的好项目并不能在 Xcode 外执行。我们开发了 swiftlog ,这是一个简单的日志记录程序。

阅读全文

作者:Joe,原文链接,原文日期:2016-01-01
译者:星夜暮晨;校对:numbbbbb;定稿:Cee

Swift 中的字符串处理一直都在变化,一直不断发展。在研究 Swift 中某些字符串执行操作的演变过程中,我注意到了 Joel Spolsky 十几年前写的这篇文章),他告诫我们所有人一定要顺应潮流,从一开始就要让我们的应用程序支持 Unicode。Swift 1.0 没有忽视这种请求,它确实让我们可以简单地使用范围 (Range) 这种「自然」的表达方式来提取子字符串。但是 Swift 2.0 却将其摒弃了,这使得 Stackoverflow 上赞数最高的这个回答变得毫无用处。

下面的代码无法正常工作,但是如果可以,那真是极好的:

var helloWorld = "Hello, world!"
let hello = helloWorld[0...4]
print(hello)

阅读全文

作者:Joe,原文链接,原文日期:2016-02-16
译者:Cee;校对:numbbbbb;定稿:小锅

Swift 3.0

如果你在寻找 Swift 2.2 的 Ubuntu 包,可以参考我们的这篇指南。

Swift 3.0

Swift 2.2 已经从 master 分支移到了 swift-2.2 分支。现在,Swift 3.0 版本在仓库的 master 分支上开发。克隆编译完整的 Swift 3.0 源代码的方法已经和之前截然不同了。比起之前需要克隆逐个仓库,现在你只需要:

mkdir swift-build
cd swift-build
git clone https://github.com/apple/swift.git
./swift/utils/update-checkout --clone

阅读全文

作者:shanks

不知不觉,每周问答已经到了10期了,在stackoverflow上浏览 swift 相关问题,也让我收益不少。这个栏目会一直办下去,慢慢会对一些共性的问题进行分类和整理。本周共整理了 5 个问题。涉及问题有:字典元素的删除;optional存在的理由;可失败构造器的属性初始化问题;数组到字典的转换问题;for循环步长问题。

本周整理问题如下:

阅读全文

作者:Olivier Halligon,原文链接,原文日期:2015-12-05
译者:小锅;校对:numbbbbb;定稿:Cee

正如大家所知的,Swift 在本周的早些时候开源了(校对注:按照原文的发布时间来看确实是「本周」)。对社区来说这无疑是一个爆炸性的消息,已经有很多的帖子在讨论这件事会产生的一系列后果。

然而我想做一件跟大家不同的事情™,今天我要趁这个机会跟大家分享一下我自己的开源经历,并说明为什么向开源社区做贡献对每个人都有好处。

阅读全文

作者:Ole Begemann,原文链接,原文日期:2016-01-03
译者:aaaron7;校对:numbbbbb;定稿:Cee

ICU 的字符串变换很酷。ICU 库提供了一整套强大的文本变换功能,在处理用户输入、特别是当你的程序需要处理一些英语之外的语言或者非拉丁字符时非常有用。举个例子,你可以把一段简体中文转码成拉丁字符,同时清除音调符号、修饰符和隐藏字符,最后全部转换成小写,使其成为可以被你的数据库搜索 API 识别的字符串,而所有这些变换,只要一行代码就可完成。

在 Apple 的平台中,字符串变换一直以来都是通过 Core Foundation 的 CFStringTranform 函数来实现。Mattt Thompson 在 NSHipster 上对该 API 有非常棒的介绍,推荐阅读。

阅读全文

作者:Erica Sadun,原文链接,原文日期:2015-12-27
译者:DianQK;校对:Cee;定稿:numbbbbb

我觉得我不需要再介绍 Git 了,大家应该已经很熟悉了。

Package.swift

我认为建立一个 git 仓库来使用包管理工具不需要学什么新东西。毕竟使用一个包仅仅是意味着贴一行代码到一个 app 包中,不是吗?

我创建了一个 Package.swift 文件,我想我只需要编译就能用。

import PackageDescription
let package = Package (
name: "myutility",
dependencies: [
.Package(url: "https://github.com/erica/SwiftString.git",
majorVersion: 1),
]
)

然而我失败了。

阅读全文

作者:shanks

大家新年好,每周问答整理又来了。这个栏目会一直做下去,目前的表达形式也在想做一些改变,更加方便大家阅读,不过还没想好具体怎么做,大家有啥意见,都可以提出来哈。本周共整理了 5 个问题。涉及问题有:泛型输出类型问题,数组的contains方法问题,数组的元素合并问题,枚举原始值的默认值问题,字典的扩展问题

本周整理问题如下:

对应的代码都放到了 github 上,有兴趣的同学可以下载下来研究:点击下载

阅读全文

作者:Radek Pietruszewski,原文链接,原文日期:2015-08-31
译者:walkingway;校对:Cee;定稿:小锅

一年前,在 Swift 推出不久后,我观察到许多 iOS 开发者仍然以 Objective-C 的开发习惯来写 Swift。而在我眼中,Swift 是一门全新的语言,有别于 Objective-C 的语法、设计哲学乃至发展潜力,因此我们更应探索出一条属于 Swift 独有风格的发展道路。我在之前的文章 Swifty methods 中已经探讨过在 Swift 中如何清晰、明确地对方法进行命名,随后我开始连载 Swifty API 系列文章,同时将这一想法付诸实践,探索如何设计更加简单易用的接口 API。

阅读全文

作者:Olivier Halligon,原文链接,原文日期:2016-02-06
译者:ray16897188;校对:小锅;定稿:numbbbbb

在之前的一篇文章中,我介绍了如何在Swift中使用throw做错误处理。但是如果你处理的是异步流程,throw 就无法胜任,该怎么办?

throw 和异步有啥问题?

回顾下,我们可以像下面这样,在一个可能失败的函数中使用 throw 关键字:

// 定义错误类型和一个可抛出的函数
enum ComputationError: ErrorType { case DivisionByZero }
func inverse(x: Float) throws -> Float {
guard x != 0 else { throw ComputationError.DivisionByZero }
return 1.0/x
}
// 调用它
do {
let y = try inverse(5.0)
} catch {
print("Woops: \(error)")
}

但如果函数是异步的,需要等待一段时间才会返回结果,比如带着 completion block 的函数,这个时候怎么办?

阅读全文

作者:Radek Pietruszewski,原文链接,原文日期:2015-12-14
译者:Prayer;校对:Channe;定稿:numbbbbb

guard 是 Swift 2 中我最喜爱的特性之一。虽然完全不使用 guard 也没有什么影响,它只是给我们提供了更微妙的句法表达,但是如果能够正确使用 guard 语句,无疑是一件令人愉快的事。它可以让我们的方法表意更加明确,更易于阅读,它能够表达『提前退出』的意图,同时提高了程序的健壮性。

因此,学习和理解如何正确使用 guard 表达式非常重要。guard 有它适用的场景,但是这并不意味着要将所有的 if..elseif let 语句都替换成 guard 语句。虽然 guard 语句很棒,但是很容易被滥用,并不是所有的代码结构中都适合使用 guard 语句。

下面是 guard 语句的使用原则。

阅读全文

作者:NatashaTheRobot,原文链接,原文日期:2016-1-13
译者:walkingway;校对:Cee;定稿:numbbbbb

我认为关于 Swift 最棒的一个特性就是:在这门语言构建的工程中可以使用大量的不可变对象。这种特性使我们的代码更加清晰,也更加安全(如果你还对此存疑,强烈推荐观看这篇演讲)。

但当我们真正需要去改变数据时,又该怎么处理呢?

阅读全文

作者:Erica Sadun,原文链接,原文日期:2016-01-04
译者:littledogboy;校对:千叶知风;定稿:numbbbbb

另一篇关于 Playground 的文章:如何优雅地使用 Playground

排序 Playground 页面

如果在同一个文件中有多个 playground 页面(我就是这样),那么你会发现如果按照字母排序,查找起来会很方便。使用 Edit > Sort > ByName 来整理你的文件结构。

阅读全文

作者:GABRIEL THEODOROPOULOS,原文链接,原文日期:2015-09-14
译者: 校对:Cee;定稿:Channe

在你即将完成一个大型应用时,或者老板、用户找到你时,你才意识到这个应用还缺少一个重要功能:将内容发布到 Facebook 或 Twitter。面临死线,深呼一口气,你花费了无数的小时坐在电脑前去集成 Facebook 或 Twitter 的 SDK,但是最后发现要实现这个功能实在是太难了,或者几乎是不可能实现。这时,你该怎么办呢?可能是时候考虑找一些借口告诉老板或者客户并不准备递交这个 App 了。着急的满头大汗或者不知所措?或者,是否有一种能够简单快捷的方法能让你的应用在短时间内集成分享功能呢?

阅读全文

作者:Gabriel Theodoropoulos,原文链接,原文日期:2016-1-3
译者:小铁匠Linus;校对:千叶知风;定稿:小锅

从很久以前开始,社交网络就成为了我们每天生活的一部分了。同时,社交网络也是我们程序员生活的一部分,绝大多数的应用都对进行了集成,用于接收和发送用户的信息。在大多数情况下,用户都被要求能在应用中绑定每个社交网络,并且授权该应用能代表用户发起请求。有很多这样的社交网络,比如 Facebook 和 Twitter 是使用比较频繁的。另外,iOS 也对 Facebook 和 Twitter 有内置的支持。但是,对于大多数其他的社交网络来说,开发者必须要配置一下才能成功地使得应用授权每个社交网络,并能代表用户发起请求。本教程中,我们将针对 LinkedIn 这样的一个社交网络演示如何使应用获得授权,并能与服务器传递受保护数据。

阅读全文

作者:Jameson Quave,原文链接,原文日期:2015-12-28
译者:CMB;校对:Cee;定稿:千叶知风

这是一个常见的场景:你有一个 tableView 或者一个 collectionView,并且里面含有大量不同种类的内容。你想做到基于不同种类的内容而展示不一样的 cell ,而且这些 cell 都混合在同一个部件里(原谅我站在艺术的角度去设计),它看起来就如下图所示:

阅读全文