作者:Mark Lacey,原文链接,原文日期:2018-04-26
译者:灰s;校对:numbbbbb mmoaay;定稿:CMB

今年早些时候,Swift 编译器实现了一种新的可选类型隐式解包 (IUOs),在最近的 Swift 测试版本 中开放使用。它实现了 SE-0054 - Abolish ImplicitlyUnwrappedOptional Type。对于 Swift 来说,这是一次重大的改变,消除了类型检测中的一些矛盾,并且阐明了处理这些值的规则,使语义保持一致且易于推理。更多信息可以阅读这条提案的 动机

主要变化是,当引用一个被声明为隐式解包可选的基础类型 T 时,在诊断信息中会打印 T?,而不是之前的 T!。你可能会遇到源代码兼容性问题,需要修改代码之后才能编译成功。

阅读全文

作者:Mike Ash,原文链接,原文日期:2015-06-05
译者:阳仔;校对:numbbbbbliberalism;定稿:CMB

Objective-C Runtime 是绝大多数 Mac 和 iOS 程序代码的核心。Runtime 的核心就是 objc_msgSend 函数,这个函数最关键的就是方法缓存。我在这篇文章中将会阐述一下,Apple 是如何在不影响性能的情况下,以线程安全的方式来重新分配缓存大小、释放方法缓存。

阅读全文

作者:Mike Ash,原文链接,原文日期:2015-02-06
译者:Lefe_x;校对:numbbbbbYousanflicsliberalism;定稿:CMB

在 Swift 中有个有趣的现象:它没有与线程相关的语法,也没有明确的互斥锁/锁(mutexes/locks)概念,甚至 Objective-C 中有的 @synchronized 和原子属性它都没有。幸运的是,苹果系统的 API 可以非常容易地应用到 Swift 中。今天,我会介绍这些 API 的用法以及从 Objective-C 过渡的一些问题,这些灵感都来源于 Cameron Pulsford。

阅读全文

作者:Ole Begemann,原文链接,原文日期:2018-03-22
译者:小袋子;校对:numbbbbbYousanflics;定稿:Forelax

我经常需要在某些操作中创建临时文件,每次都很繁琐:必须有合适的临时目录,确保文件名是唯一的,最后还不能忘记在操作完成之后删除文件。

实际上,“创建”是一个错误的说法,因为创建工作通常是由我使用的 API 负责的 — 而我只是提供了一个指向目的位置的 URL。举个例子,假设你的应用提供了一个分享 PDF 文件的功能。你需要创建一个 UIGraphicsPDFRenderer对象来生成 PDF,然后调用 writePDF 方法并传入临时文件的 URL 生成 PDF 文件,最后在 iOS 分享列表(share sheet)中分享它。

为了使这个操作更加简便,我最近写了一个简单的 Swift 工具类。你可以这样使用:

阅读全文

作者:Nick Hanan,原文链接,原文日期:2016/05/05
译者:TonyHan;校对:Yousanflics;定稿:Forelax

理想情况下,错误永远不会出现。我们所需的文件永远可以访问,网络永远可用并且稳定。不幸的是,现实并不理想,我们需要处理这种不理想的结果。幸运的是,Swift 团队在 Swift 2 中包含了一种很好的方式来处理与理想情况的偏差。Swift Error Handling 能够让我们快速而简便的告知编译器一个函数能否抛出错误,并且在抛出后以合适的方式去处理错误。

阅读全文

作者:Sai Kambampati,原文链接,原文日期:2017-06-14
译者:智多芯;校对:liberalismLision;定稿:CMB

Apple 公司在 WWDC 2017 发布了几个令开发者感到兴奋的框架和 API,而在这些新框架中最受欢迎的绝对非 Core ML 莫属了。开发者可以通过 Core ML 框架将机器学习模型集成到应用程序中,该框架最大的优点是使用它并不需要开发者具备额外的神经网络或机器学习知识。Core ML 框架的另一个特点是,只要开发者将已经训练好的数据模型转换成了 Core ML 模型即可使用。为了演示,本文将直接使用 Apple 开发者网站上提供的一个 Core ML 模型。闲话少说,下面开始学习 Core ML。

注:本文要求使用 Xcode 9 beta 编写代码,还需要一个安装了 iOS 11 beta 的设备(译者注:也可使用 iOS 模拟器)用于测试文中实现的功能。虽然 Xcode 9 beta 同时支持 Swift 3.2 和 4.0,但文中所有的代码都使用了 Swift 4.0 编写。

阅读全文

作者:MATTHIJS HOLLEMANS,原文链接,原文日期:2017-02-07
译者:TonyHan;校对:冬瓜liberalism;定稿:CMB

从 iOS 10 开始,苹果在 iOS 平台上引入了两个深度学习的框架:BNNS 和 MPSCNN。

  • BNNS:全称为香蕉(bananas,译者注:此处开玩笑),Basic Neural Network Subroutines,是 Accelerate 框架的一部分。这个框架能够充分利用 CPU 的快速矢量指令,并提供一系列的数学函数。

  • MPSCNN 是 Metal Performance Shaders 的一部分。Metal Performance Shaders 是一个经过优化过的计算内核框架,并且可以运行在 GPU (而不是 CPU)上。

所以,作为 iOS 开发者,有了两个用于做深度学习的框架,它们有很多类似的地方。

应该选择哪个呢?

在这篇文章中,我们将针对 BNNS 和 MPSCNN 进行对比来显示出这两者的差异。而且我们会对这两个 API 进行速度测试,来看下谁更快一些。

阅读全文

作者:Soroush Khanlou,原文链接,原文日期:2018-04-11
译者:ennisk;校对:numbbbbb;定稿:CMB

去年我写了一篇关于在类中添加普通可选型属性使扩展功能变得更简单的文章,但是从长远来看会对代码库造成一定的损害,本文接上一篇内容。

假设你正在设计 App 中的认证流程,而且知道这个流程不是简单的线性执行代码,所以想写一些测试代码。

阅读全文

作者:Ole Begemann,原文链接,原文日期:2018-03-27
译者:小袋子;校对:numbbbbb;定稿:CMB

你知道 URLSession 能同时返回响应和错误吗?

我之前介绍过,Swift 强类型系统的一个主要优点是天生具备编译器强制遵循的文档规范。

类型是编译器强制遵循的文档规范

类型为函数的行为设立了一种“界限”,因此一个易用的 API 应该精心选择输入输出类型。

阅读全文

作者:Josh Steiner,原文链接,原文日期:2016-03-01
译者:muhlenXi;校对:Yousanflicsaaaron7;定稿:CMB

在 11 月份,thoughtbot 发布了一个叫 Purple Train 的 APP ,该 APP 是用 React Native 实现的, React Native 一直被用于快速构建跨平台的 APP 。由于 Reactive Natice 对传统移动开发的许多改进,使我们更加喜欢它,比如声明性 API、更快的开发周期、对 Web 开发和设计师来说更友好和跨平台等。但是 React Native 并不是对每个 APP 都非常合适,它虽然适合大多数的 APP ,但仍然有一个主要的缺陷:JavaScript

JavaScript 作为一门语言它一直在改进,它有一个显著优点就是无所不在,然而,它也以 奇怪的行为 和弱类型系统(读作 aggressive type coercion )而闻名。

阅读全文

作者:Soroush Khanlou,原文链接,原文日期:2018-02-21
译者:东莞大唐和尚;校对:Lefex;定稿:CMB

苹果官方文档中提到过 MVC 的软件设计模式。不过,苹果介绍的并不是本质意义上的 MVC 。关于这一点我之前也有写过一篇文章,MVC 是为 Smalltalk 语言设计的一种设计模式。在 Smalltalk 语言里,MVC 的三个组件:模型(model)、视图(view)和控制器(controller)之间都可以相互通信。这就意味着要么视图知道自己持有的模型是如何实现的,要么模型知道自己是如何在视图中被应用的。

我们写 iOS 软件的时候,通常会把可以直接通信的视图和模型称之为“反模式”(PS:不推荐这么做)。我们所谓的 MVC 更准确的说其实是“模型-视图-适配器(Model - View - Adapter)”。我们说的“视图控制器”其实只是模型和视图中间沟通的一个桥梁。笼统来讲,我觉得这是对正统MVC一个不错的改良——不是把视图和模型绑在一起,而是通过一个适配器把模型和视图联系起来,这个方法不错。然而,不得不说,在我工作中涉及到的大部分系统中,模型和视图都是分开的。

以上就是为什么 iOS 开发里会有视图控制器的原因:用来连接模型和视图。但是这种模式的编码会产生一些问题:有一些代码看起来既不属于模型,也不属于视图,所以我们就把这些代码放到了视图控制器里,最后视图控制器变得超级臃肿。关于这个问题,我在博客里面讨论过很多次,但这次我想说的不是这个问题。

阅读全文

作者:Andyy Hope,原文链接,原文日期:2016-05-18
译者:muhlenXi;校对:YousanflicsLision;定稿:CMB

通常情况下,人们在学习了函数式编程(Function Programming 即 FP)之后就根本停不下来对它的修改,甚至到了一种如果 FP 不是特别酷的话就会烦躁的地步。回忆一下 1999 年经典非主流电影 Fight Club 最著名的情景,完全颠覆了人们的头脑。

函数式编程俱乐部的条例:
1.永远不要停止函数式编程。
2.永远不要停止函数式编程!

阅读全文

作者:Soroush Khanlou,原文链接,原文日期:2017/07/06
译者:Cwift;校对:numbbbbb;定稿:CMB

Swift 的 Promise 可以让代码变得简单、正确并具有良好的语义。Swift 的错误处理系统也不例外,正确使用它可以大大提高服务器端代码质量。我们的应用 Beacon 使用 Vapor 构建 API。Vapor 提供了许多构建 API 的基本组件,但更重要的是,它提供了扩展功能,你可以自己添加错误处理。

阅读全文

作者:Arthur Knopper,原文链接,原文日期:2017/03/14
译者:imiem;校对:pmst;定稿:mmoaay

Social Framework 使在 App 中使用社交分享成为可能。本教程中我们将从图库中选取一张图片,然后在 Twitter 中分享一个带图片的推文。本教程使用 Xcode 8.2.1 和 iOS 10.2。

阅读全文

作者:Ole Begemann,原文链接,原文日期:2017/07/24
译者:Forelax;校对:Joy;定稿:Forelax

我一直不喜欢 Xcode 默认给新文件头部添加的注释。在我看来,从注释里得到的绝大多数信息要么和文件本身没有关系,要么通过版本控制,你能得到更详尽的信息。此外,当文件和项目更名的时候,这些注释会立刻显得过时。

阅读全文

作者:Jameson Quave,原文链接,原文日期:2017-06-06
译者:冬瓜;校对:Forelax;定稿:CMB

在 iOS 11 发布后,开发者们首次可以在 iPhone7 或者更高的设备上调用 NFC 读取相关的接口。这些接口可以用于传递身份信息或者是用于实现类似门禁、地铁闸机这种功能的数据交换应用。

在 iOS 11 中,这项技术被称作 Core NFC,下面我将在教程中使用 Swift 4 来讨论如何使用它。

阅读全文

作者:Joe,原文链接,原文日期:2016/06/30
译者:EyreFree;校对:walkingway;定稿:CMB

开源 Swift 已经有一些更新来利用新版本的 CMake 在 Linux 上构建 Swift。需要指出的是,Ubuntu 14.04 (2.8.12.2) 自带的默认版 cmake 不再胜任这项工作。

让我们把 Ubuntu 14.04 的 CMake 升级到 3.4.3,开发者表示该版本可以满足需求。

当通过源代码安装软件时,通常会有一个构建区在 /usr/local/src 和一个存档区(所以可以跟踪我构建的版本)在 /usr/local/archive

使用 root 账户或者用 sudo 方式执行:

# cd /usr/local/archive
# wget https://cmake.org/files/v3.4/cmake-3.4.3.tar.gz
# cd ../src/
# tar -xzvf ../archive/cmake-3.4.3.tar.gz

接下来,进行配置并且构建:

# cd cmake-3.4.3
# ./configure --prefix=/usr/local
...
CMake has bootstrapped. Now run make.
# make

最后,make install 会将 cmake 和它的关联设置安装到 /usr/local 目录下。

# make install
# which cmake
# cmake --version
cmake version 3.4.3

CMake suite maintained and supported by Kitware (kitware.com/cmake).

以上就是全部过程。构建愉快!

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg