作者:APPCODA EDITORIAL TEAM,原文链接,原文日期:2019-01-07
译者:Roc Zhang;校对:pmstnumbbbbb;定稿:Forelax

在计算机科学中,有很多问题可以通过将底层数据结构用优先级队列实现来改善算法的时间复杂度。其中 Dijkstra 的最短路径算法便是一个例子,该算法使用了优先级队列来在图中搜索两个顶点间的最短路径。

不幸的是,Swift 的标准库中并没有提供优先级队列的默认实现。所以我们将会研究如何自行实现基于堆的优先级队列。

阅读全文

作者:Olivier Halligon,原文链接,原文日期:2018-12-15
译者:Nemocdz;校对:numbbbbbYousanflics;定稿:Forelax

StringInterpolation 协议最初的设计效率低下又不易扩展,为了在后续的版本中能够将其彻底重构,Swift 4 中将该协议标记为废弃。即将在 Swift 5 中亮相的 SE-0228 提案介绍了一种新的 StringInterpolation 设计,使得 String 有了更大的潜能。

阅读全文

作者:Andrew Jaffee,原文链接,原文日期:2018-04-17
译者:灰s;校对:Ceenumbbbbb;定稿:Forelax

作为 iOS 开发,我们十分清楚人们都喜欢互通性。我们喜欢通过无线设备与其他人进行沟通这一点是显而易见的。最近,我们开始希望能够与那些曾经被认为是独立的普通设备进行通信。我们开始喜欢,甚至是期望,部分无线设备可以收集并且分析自己的数据(通常称为“可穿戴设备”)。许多设备已经成为我们生活里的一部分,还为还有一个专门的术语来描述它:“Internet of Things” 或者 “IoT”(物联网)。现在地球上有数十亿的无线通讯设备。在这篇教程中,我们将聚焦 IoT 其中的一部分:蓝牙。

我将说明蓝牙技术背后的基本概念,以及:

  • 展示如何精通蓝牙方向的软件开发,从而为你提供巨大的职业机遇
  • 提醒你必须去确认在发布一个使用蓝牙技术的应用时是否需要通过“资格审查”
  • 给你提供 Apple 的Core Bluetooth 框架概述 (也可以参阅这里)
  • 最后,带领你使用 Swift 4 并通过 Core Bluetooth 和一个蓝牙设备来开发一款用于监控心率的 iOS 应用程序

提示:注意跟随阅读文章中包含的超链接。对于开发者这是重要的资料,它确保你完全理解蓝牙的工作方式以及苹果是如何支持蓝牙这种技术的。

阅读全文

作者:Olivier Halligon,原文链接,原文日期:2018-09-02
译者:灰s;校对:numbbbbb小铁匠Linus;定稿:Forelax

在 Swift 中,协议中声明的属性没有访问控制的能力。如果协议中列出了某个属性,则必须使遵守协议的类型显式声明这些属性。

不过有些时候,尽管你会在协议中声明一些属性,但你是要利用这些属性来提供你的实现,并不希望这些属性在类型的外部被使用。让我们看看如何解决这个问题。

阅读全文

作者:Mattt,原文链接,原文日期:2018-11-19
译者:雨谨;校对:numbbbbbpmst;定稿:Forelax

上个月,苹果公司 在 Swift.org 论坛上宣布,正在着手为 Swift 和 C 语言支持 Language Server Protocol(语言服务器协议,LSP)。

对于苹果公司而言,为所有 Swift 开发者 —— 包括非苹果平台上的 —— 提供高质量的工具支持非常重要。我们希望与开源社区合作,将精力集中在构建 Xcode 和其他编辑器、其他平台可以共享的公共基础设施上。为实现这一目标,[……],我们决定支持 LSP。

Argyrios Kyrtzidis,2018 年 10 月 15 日

这可能是苹果自 2014 年将 Swift 作为开源软件发布以来,为 Swift 做出的最重要的决定。 这对于 APP 开发者来说是一件大事,对于其他平台上的 Swift 开发者来说更是一件大事。

为了理解其中的原因,本周的文章将研究 Language Server Protocol 解决了什么问题,它是如何工作的,以及它的长期影响可能是什么。

阅读全文

作者:Wooji Juice,原文链接,原文日期:2018-11-14
译者:石榴;校对:numbbbbbCee;定稿:Forelax

流畅的动画一开始就被认为是 iOS 应用的特点之一。这不仅归功于 iOS 系统强大的动画引擎(从而使得 App 能够一边展示流畅的动画一边做着其他的事情),还归功于系统提供的非常方便的动画 API:

// 无动画
doStuff()
// 有动画
UIView.animate(withDuration: 1) { doStuff() }

只需要将你的代码放进 block(闭包)中,就可以让它们拥有流畅的缓入缓出的动画效果。

然而,如果你使用过这套系统,你可能会遇到一些问题。这个系统可以完美地处理简单的情况,比如让一个东西淡入、淡出,或改变它的颜色,但在更复杂的情况下,这种方法就会开始出现问题。

阅读全文

作者:Soroush Khanlou,原文链接,原文日期:2018-09-07
译者:Nemocdz;校对:Yousanflicspmst;定稿:Forelax

回想 Crusty 教我们使用面向协议编程之前的日子,我们大多使用继承来共享代码的实现。通常在 UIKit 编程中,你可能会用 UIView 的子类去添加一些子视图,重写 -layoutSubviews,然后重复这些工作。也许你还会重写 -drawRect。但当你需要做一些特别的事情时,就需要看看 UIView 中其他可以被重写的方法。

阅读全文

作者:Russ Bishop,原文链接,原文日期:2018-10-30
译者:zhongWJ;校对:numbbbbbCee;定稿:Forelax

假设我们想要用 statfs() 方法来确定某个挂载点所对应的 BSD 设备名。例如挂载点 /Volumes/MyDisk 对应的 BSD 设备是 /dev/disk6s2

struct statfs fsinfo;
if (statfs(path, &fsinfo) != 0) {
//错误
}

阅读全文

作者:Mattt,原文链接,原文日期:2018-08-20
译者:Hale;校对:numbbbbbpmstYousanflics;定稿:Forelax

到了 20 世纪 30 年代,Rube Goldberg 已成为家喻户晓的名字,与 “自营餐巾” 等漫画中描绘的奇异复杂和异想天开的发明同义。大约在同一时期,阿尔伯特·爱因斯坦对尼尔斯·玻尔量子力学的普遍解释进行了 批判,并从中提出了“鬼魅似的远距作用”这一词汇。

近一个世纪之后,现代软件开发已经被视为可能成为 Goldbergian 装置的典范——通过量子计算机相信我们会越来越接近这个鬼魅的领域。

作为软件开发人员,我们提倡尽可能减少代码中的远程操作。这是根据一些众所周知的规范法则得出的,如 单一职责原则最少意外原则笛米特法则。尽管它们可能会对代码产生一定的副作用,但更多的时候这些原则能使代码逻辑变得清晰。

这是本周关于 Swift 属性观察文章的焦点,它提出了一种内置的轻量级替代方案,适用于更正式的解决方案,如模型 - 视图 - 视图模型(MVVM)函数响应式编程(FRP)。

阅读全文

作者:Soroush Khanlou,原文链接,原文日期:2018-09-19
译者:WAMaker;校对:numbbbbb小铁匠Linus;定稿:Forelax

Swift 4.2 为哈希的实现带来了一些新的变化。在此之前,哈希交由对象本身全权代理。当你向对象索取 哈希值(hashValue)时,它会把处理好的整型值作为哈希值返回。而现在,实现了 Hashable 协议的对象则描述了它的参数是如何组合,并传递给作为入参的 Hasher 对象。这样做有以下几点好处:

  • 写出好的哈希算法很难。Swift 的使用者不需要知道如何组合参数来获得更好的哈希值。
  • 出于不提倡用户以任何形式存储哈希值,以及 一些安全方面因素 的考虑,哈希值在程序每次运行的时候都应该有所不同。描述性的哈希允许哈希函数的种子在每次程序运行的时候发生改变。
  • 能实现更多有意思的数据结构,这也是我们这篇文章接下来会聚焦的。

阅读全文

作者:Andrew Jaffee,原文链接,原文日期:2018-08-06
译者:jojotov;校对:Forelaxpmst;定稿:Forelax

本次教程是 AppCoda 上周开启 的设计模式系列的第二期。在软件设计领域的四位大师级人物(GoF,又称“四人帮”或“Gang of Four”) —— Erich Gamma, Richard Helm, Ralph Johnson 和 John Vlissides 所著的 《设计模式:可复用面向对象软件的基础》一书中,首次对软件设计中总共 23 种设计模式进行了定义和归类,并对它们作了专业阐述。今天,我们将聚焦于其中两个行为型设计模式 —— “观察者模式” 和 “备忘录模式”。

阅读全文

作者:terhechte,原文链接,原文日期:2018-01-10
译者:rsenjoyer;校对:numbbbbbYousanflics;定稿:Forelax

可选值(Optional)是 Swift 语言最基础的内容。我想每个人都同意它带来了巨大的福音,因为它迫使开发者妥善处理边缘情况。可选值的语言特性能让发者在开发阶段发现并处理整个类别的 bug。

然而,Swift 标准库中可选值的 API 相当的有限。如果忽略 customMirrordebugDescription 属性,Swift 文档 仅仅列出了几个方法/属性:

var unsafelyUnwrapped: Wrapped { get } 
func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U?
func flatMap<U>(_ transform: (Wrapped) throws -> U?) rethrows -> U?

阅读全文

作者:Mike Ash,原文链接,原文日期:2018-09-26
译者:Nemocdz;校对:numbbbbb小铁匠Linus;定稿:Forelax

尽管 Swift 重心在强调静态类型上,但它同时支持丰富的元数据类型。元数据类型允许代码在运行时检查和操作任意值。这个功能通过 Mirror API 暴露给 Swift 开发者。大家可能会感到困惑,在 Swift 这种如此强调静态类型的语言里,Mirror 这样的特性是怎么工作的?让我们一起来通过这篇文章了解一下。

阅读全文