作者:Erica Sadun,原文链接,原文日期:2016-05-11
译者:pucca;校对:wiilen;定稿:CMB

昨天在 Swift-Users 有人提问如何防止序列(sequence)为空。这个问题来源于如何在断言(predicate)中测试一个序列,由此引发的问题是如果序列为空,会返回 true 来满足断言。

阅读全文

作者:COSMIN PUPĂZĂ,原文链接,原文日期:2016/06/29
译者:saitjr;校对:Cee;定稿:CMB

Apple 在 WWDC 上已将 Swift 3 整合进了 Xcode 8 beta 中,并会在今年晚些时候发布 Swift 3 的正式版。这是 Swift 在开源和支持 Mac OS X 与 Linux 之后的首个版本。如果你在去年 11 月关注了 Swift 进化史 和已经启动的 IBM 沙盒 项目,那你应该知道 Swift 确实改动很多。甚至可以确定你在 Xcode 8 上根本无法编译既有项目。

阅读全文

作者:AppCoda,原文链接,原文日期:2016-05-19
译者:Prayer;校对:numbbbbb;定稿:CMB

排着长队等待结账的商店,帮助旅客记录包裹和航班信息的机场,帮助大型零售商处理大量无聊的存货清单,这些场景非常适合使用条码扫描器。此外,条码扫描器也能帮消费者进行智能购物和产品分类。既然它这么棒,不如我们在 iPhone 上做一个吧!

幸运的是,对 Apple 开发者来说,实现条码扫描非常容易,苹果大法好!我们会使用 AV Foundation 来实现一个小巧的 iPhone app,能够扫描 CD 上的条码,获取专辑的一些重要信息,并将内容输出到 App 视图中。能够实现读取条码的功能,这非常的酷,但是我们的野心不止于此,我们会对识别的条码内容作进一步的操作。

我本不该再多啰嗦,不过还是友情提醒一下,这个条码扫描 app 只有在设备具有摄像头时才能正确工作。记住这一点,准备一台有摄像头的 iOS 设备,我们开始吧!

阅读全文

不久之前,在我写的好与坏,Swift面面观 Part1一文中,我介绍了一些关于在 Swift 里怎样去写出优秀代码的小技巧。在 Swift 发布到现在的两年里,我花费了很长时间去牢牢掌握最佳的实践方法。欲知详情,请看这篇文章:好与坏,Swift面面观 Part1.

注:好与坏,Swift面面观 Part1 译文链接

在这个系列的文章中,我将尝试提炼出我认为的 Swift 语言中好与不好的部分。唔,我也希望在未来有优秀的 Swift 开发者来帮助我征服 Swift (唔,小伙子,别看了,中央已经决定是你了,快念两句诗吧)。如果你有什么想法,或者想告诉我一点作为开发者的人生经验什么的话,请在 Twitter 上联系我,我的账号是 ksmandersen

好了废话不多说,让我们开始今天的课程吧。

阅读全文

作者:Andyy Hope,原文链接,原文日期:2016-03-18
译者:BigbigChai;校对:shanks;定稿:CMB

并不是世外桃源,但也很不错!

很高兴见到 Objective-C 的老司机对于 Swift 的新鲜语法结构和新思维方式感到如此兴奋。作为开发者,我们应该永远努力拓展我们的技能,并在新的范式出现的时候乐于改变我们的心态。

一个类似的例子就是处理数据结构的时候,拥抱不可变性,尽量使用常量,这是一个很好的建议而且完全应该被采用。另一个例子是把我们的数据模型转换为 Struct(结构体)。这是听起来很美好,但在实际运用中,彻底地使用 Struct 来代替 Class(类),还是给开发者带来很多困难。

不要误会我的意思,用 Struct 作为数据模型确实带来了非常大的好处。 只是这并不是完美的办法。在这篇文章中,我会详细说明一下当你把数据模型从 Class 转换成 Struct 时会遇到的麻烦。

阅读全文

Swift 发布之后,Swift 的开发者一直在强调,安全性与可选择类型是 Swift 最为重要的特性之一。他们提供了一种’nil’的表示机制,并要求有一个明确的语法在可能为’nil’的实例上使用。

可选择类型主要以下两种:

  1. Optional
  2. ImplicitlyUnwrappedOptional

阅读全文

在 WWDC 2014(苹果 2014 年开发者大会)发布的 Swift 编程语言,大约在一周内将迎来它的两周岁生日(译注:WWDC 2014 的时间是 2014-6-3)。当时听到这个消息,我们在工作室里兴奋地跳了起来,并从此投入到了 Swift 的怀抱。然而两年时间过去了,我依然在苦苦思索着怎样写出好的 Swift 代码。要知道 Objective-C 已经快有三十年历史了,我们都已经摸索出 Objective-C 的最佳实践,以及什么是好或坏的 Objective-C 代码,然而 Swift 还很年轻。

在这一系列的文章里,我将尝试提炼出我认为的 Swift 语言中好与不好的部分。诚然我不是这方面的专家,我只是希望抛砖引玉,分享我对这个问题的思考,并激励其它开发者(没错就是你)表达自己的见解。如果你对此有任何想法、批评,或者对于好代码的看法,可以在原文下面留言,或者 在 Twitter 上联系我

让我们进入正题。

阅读全文

作者:Joe,原文链接,原文日期:2016-06-25
译者:小锅;校对:saitjr;定稿:CMB

我们对“让 Swift 3.0 在更多的 Linux 系统上运行”这件事充满了热情,因此我们开始在 Ubuntu 16.04,即 Xenial Xerus,X86 系统上构建 Swift 3.0。安装过程十分简单,只需要添加我们的 APT 仓库,并使用 apt-get 就可以了。二进制文件会被安装到 /opt/swift/swift-3.0 目录下,所以在安装 3.0 版本后需要更新 path 路径。编辑手记:对于我们为什么使用 /opt/swift 而不是 /usr/bin/ 目录,可以在 swift-dev 邮件列表上的这个帖子里面找到原因。

阅读全文

作者:Jameson Quave,原文链接,原文日期:2016-06-20
译者:Crystal Sun;校对:numbbbbb;定稿:CMB

这篇教程写于 2016 年 6 月 20 日,使用 Xcode 8 Beta 1 和 Swift 3 开发。

此文章是 SiriKit 教程系列的第二篇,建议先去阅读第一篇

处理 SiriKit 请求

为了让集成的 Siri 更有用,可以使用 INSendMessageIntentHandling 协议的回调方法增加信息内容。协议有以下可选方法:

resolveRecipients(forSendMessage intent: INSendMessageIntent, with completion: ([INPersonResolutionResult]) -> Swift.Void)

resolveContent(forSendMessage intent: INSendMessageIntent, with completion: (INStringResolutionResult) -> Swift.Void)

resolveGroupName(forSendMessage intent: INSendMessageIntent, with completion: (INStringResolutionResult) -> Swift.Void)

resolveServiceName(forSendMessage intent: INSendMessageIntent, with completion: (INStringResolutionResult) -> Swift.Void)

resolveSender(forSendMessage intent: INSendMessageIntent, with completion: (INPersonResolutionResult) -> Swift.Void)

阅读全文

作者:Erica Sadun,原文链接,原文日期:2016-05-02
译者:Crystal Sun;校对:numbbbbb;定稿:Cee

今天下午发生了一场激烈的争论:

func foo<T: protocol<A,B>>(x: T)

对比

func foo<T: protocol<A, B>>(x: T)

很明显,后者赢了。为什么?因为符合正字法(orthography)的规则(定稿注:来源于希腊语中的正确(Ortho)和书写方式(Graphia),表示通用的社会性的文字表示规范。这里指约定俗成的代码规范。留白是一种美)。

阅读全文

作者:Natasha The Robot,原文链接,原文日期:2016-07-01
译者:haolloyin;校对:Cee;定稿:numbbbbb

这周末我终于有点空余时间来捣鼓一个有趣的业余项目了。我看到好友 @chiuki 做了一个叫做 Fit Cat 的 Android Watch 应用,我也想在我的 Apple Watch 上搞一个,@chiuki 同意了。

Fit Cat 会依据你的步数显示可爱的小猫咪,设计师是很有才的 @VPoltrack。你偷懒时小猫就会睡觉,你健身时它就会玩毛线球。它还会唱 K、爬山,真的很可爱。

当我在新项目中打开素材库时,立马来了兴致。为什么不创建一些 Fit Cat 的表情然后分享给朋友呢?

阅读全文

作者:Gregg Mojica,原文链接,原文日期:2016/06/24
译者:saitjr;校对:Cee;定稿:千叶知风

CocoaPods——Swift 与 Objective-C 项目的依赖管理工具,iOS 开发者的必备技能。如果你没有任何 CocoaPods 经历,那么这篇短文就是为你而写。我们将会学到什么是 CocoaPods,为什么我们要使用它,还有怎样开始使用它!

AppCoda 的绝大多数教程写得都很详细,本文要比其他传统教程短,仅作为 CocoaPods 的入门文章。

阅读全文

作者:Joe,原文链接,原文日期:2016/06/27
译者:ahfepj;校对:saitjr;定稿:Cee

如果你在推特上关注了我们(@iachievedit)你就知道我们不仅做了很多 Swift 开源项目,还有做了一些操作系统和架构。我们决定做这个项目没有特别的原因,但是看着各个版本的 git 仓库最终整合一个工具感觉真是太棒了。

我们很高兴最终 Swift 能够取代 Linux 上的其他脚本语言(比如名字读起来像 Bython 和 Buby 的两门语言),对我们来说是时候写脚本了(用 Swift)。

阅读全文

作者:Benedikt Terhechte,原文链接,原文日期:2016/04/23
译者:Lanford3_3;校对:saitjr;定稿:CMB

在 Swift 中,枚举(Enums)是一种优雅的结构化信息的方式。有时候你会发现自己需要通过原始值(raw values)来构造枚举,因为这些值可能零星地存储在某些地方,比如 NSUserDefaults

enum Device: String {
case Phone, Tablet, Watch
}
let aDevice = Device(rawValue: "Phone")
print(aDevice)

// 打印结果为: Optional(main.Device.Phone)

阅读全文

摘要

本文上半部分将为您解释为什么在实际项目中为什么不要调用 onError 以及尽量不使用 Driver 。同时给出一种合理的解决方案,让我们仍然可以愉快的传递 Error ,并对 Value 进行处理。
下半部分将介绍用函数式来精简我们的代码。

注:本文基于 Swift 3 。

阅读全文

作者:Natasha The Robot,原文链接,原文日期:2016-05-28
译者:Channe;校对:Cee;定稿:千叶知风

我最近在读《重构与模式》 。昨天(译注:原文日期的昨天),在我写描述了一个拥有多个参数的对象的《创建方法》时,想到了@modocache关于iOS API 设计中的 Swift 模式超棒的演讲,尤其是关于参数对象部分。我第一次看的时候获益匪浅,因此我希望记录下来。

阅读全文

作者:Natasha The Robot,原文链接,原文日期:2016-04-15
译者:Cee;校对:Channe;定稿:千叶知风

最新被接受的

SE-0048泛型别名在定义中引进了类型的参数,例如:

typealias StringDictionary<T> = Dictionary<String, T>
typealias DictionaryOfStrings<T : Hashable> = Dictionary<T, String>
typealias IntFunction<T> = (T) -> Int
typealias Vec3<T> = (T, T, T)
typealias BackwardTriple<T1,T2,T3> = (T3, T2, T1)

为类型重新声明别名时有一些限制条件。例如在存放字符串的词典中,主键必须实现 hashable 协议才能够使用。Swift 的编译器会在不满足限制条件时提供一些反馈:

typealias DictionaryOfStrings<T> = Dictionary<T, String>
// error: type 'T' does not conform to protocol 'Hashable'

干得漂亮。

阅读全文

作者:Joe,原文链接,原文日期:2016-04-16
译者:pucca601;校对:Cee;定稿:千叶知风

密钥,或者说「凭证」,是在使用 REST API 时难免会碰到的一件事情。当你注册了 Amplitude 后,你会得到一个密钥用来唯一识别你的应用。若你使用的是 Aeris Weather 的 API,会得到一个 ID 和密码。如果你要在 iOS 应用里调用这些 API,则需要把这些 API 密钥放在某处。在之前的一篇文章中我们整理了如何在属性列表文件中放置 API 密钥。这篇教程中,我们将要加密这些 API 密钥并且关注如何在你的 app 中访问它们。

在我们开始之前,我想要谈谈安全问题。我不是一个安全领域的专家,你很可能也不是。这篇文章原本的标题是「加密 API 密钥」,但经过再三考虑,我重新将其命名为「混淆 API 密钥」。文章中没有一处对这种混淆方式不会被破解进行了保证,因为任何人真的想要盗取你的 API 密钥时一定会用各种手段获取到。混淆这种方式只能为盗取提高一点门槛。

阅读全文

作者:Joe,原文链接,原文日期:2016-06-12
译者:shanks;校对:CMB;定稿:Cee

在过去几年的时间里,我一直从事物联网(Internet of Things,IoT)软件的开发项目。在这段时间里面,我学到了不少关于和云端通信传感以及遥感的协议方案。在物联网领域最通用的方案是 MQTT ,一个轻量级的协议,用于发布消息给频道,同时提供对频道的订阅功能。这种模式通常被称为「发布──订阅」模式

除了在做物联网和 MQTT 的工作以外,我对 Swift 语言充满了兴趣,特别是在 Swift 开源,进入了服务器端领域,能够在 Linux 下运行以后。自然地,可以把这些领域的知识连接在一起,开始使用 Swift 来实现一个 MQTT 的客户端。我们把这个基于 Swift 3.0 和 Linux 平台的 MQTT 客户端的 iOS 实现开放出来了。这个例子说明,实际上, Swift 已经同时进军了服务器端和物联网领域。

在我们开始之前,做一个免责声明:目前基于 Linux 下的 Swift 3.0 版本还处于开发者预览版阶段。从这里可以获取到在 Ubuntu 14.04 和 15.10 下使用 Swift 3.0 的信息。或者,如果你有一台如 BeagleBone Black 等基于 armv7 的设备,可以尝试使用 Swift 3.0 版本下的 ARM port

阅读全文