作者: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 这样的特性是怎么工作的?让我们一起来通过这篇文章了解一下。

阅读全文

作者:Mattt,原文链接,原文日期:2018-08-26
译者:雨谨;校对:wongzigiinumbbbbb;定稿:Forelax

在 Web 的世界里,速度不是一种奢求;它事关生死。

近年来的用户研究表明,页面加载中 _任何_ 可以察觉到的延迟 —— 即大于 400 毫秒(字面意义上的“一眨眼的功夫”) —— 都会对转化率和参与率产生负面影响。网页加载时每多花一秒,就会多 10% 的用户返回或者关闭这个页面。

对于谷歌、亚马逊和 Netflix 这样的大型的互联网公司而言,这里和那里额外的一秒钟可能意味着年收入里的 数十亿 美金。所以那些公司投入如此多的工程努力来让网页更快,也没有什么奇怪的了。

有很多加速网络请求的技术:压缩和流技术、缓存和预加载、连接池和多路复用、延迟和后台运行。然而,还有一种比它们优先级更高,效果更好的优化策略:不要在刚开始的地方发送请求

在这个方面,App 凭借先下载后使用的特点,拥有传统网页所不具备的独特优势。在这一周的 NSHipster 里,我们将展示如何以一种非传统的方式使用 Asset Catalog 来改善你的 App 的首次启动体验。

阅读全文

作者:Matthijs Hollemans,原文链接,原文日期:2018/03/28
译者:阳仔;校对:numbbbbb小铁匠Linus;定稿:Forelax

目标检测是计算机视觉中的经典问题之一:

识别一幅图像中有哪些目标,以及它们在图像中的位置。

检测是一个比分类更复杂的问题,因为分类也可以识别目标,但不能准确判断目标在图像中的位置——并且分类不能适用于包含多个目标的图像。

YOLO 是一个实时有效的目标检测神经网络。

在这篇文章中,我将阐述如何使用 Metal Performance Shaders 来将“简化版” YOLOv2 运行在 iOS 设备上。

阅读全文

作者:Mattt,原文链接,原文日期:2018-10-01
译者:saitjr;校对:冬瓜Yousanflics;定稿:Forelax

Dark Mode(深色模式)可谓是 macOS 最受欢迎的特性之一了 —— 尤其是对于你我这样的开发者来说。我们不仅喜欢文本编辑器是暗色的主题,还很看中整个系统色调的一致性。

过去几年,和这个特性旗鼓相当的要数 Night Shift(夜览),它主要是在日夜更替的时候减少对眼睛的劳损。

纵观这两个功能,Dynamic Desktop(动态桌面)也就呼之欲出了,当然这也是 Mojave 的新特性之一。进入“系统偏好设置 > 桌面与屏幕保护程序” 并且选择“动态”,就能得到一个基于地理位置且全天候动态变化的壁纸。

阅读全文

作者:iAchieved.it,原文链接,原文日期:2016-06-30
译者:rsenjoyer;校对:numbbbbb智多芯;定稿:Forelax

我最近在开源的 Swift Foundation 中遇到了 NSThread 实现的问题。如果不是尝试在树莓派 3 上运行代码,我也许就发现不了这个问题:

import Foundation
import Glibc

var counter = 0
while true {
sleep(2)
counter = counter + 1
let t = Thread(){
print("STARTED:\(counter)")
sleep(1)
print("EXIT:\(counter)")
}
print("START:\(counter)")
t.start()
}

我所期望的是每 2 秒都会创建并销毁一个线程。不幸的是在大约启动 230 个线程之后,系统资源已经耗尽,不再有新的线程被创建。解决的方式正如 SR-1908 所提到的,初始化具有系统范围的分离状态的线程

阅读全文

作者:codingexplorer,原文链接,原文日期:2018-07-18
译者:Damonwong;校对:numbbbbbBigNerdCoding;定稿:Forelax

译者注:
此篇文章以前我们曾经翻译过,原文作者在今年对这篇文章进行了更新,我们也对更新后的文章进行了翻译并再次发布。

对于大部分应用来说,都需要访问一些文件资源。这些文件资源可能在你的应用安装包中,或者在文件系统内,亦或者在某个网站服务器上。你需要用某种方法将它们体现在代码中。对于苹果平台而言,你主要有两种选择,用字符串或者 URL

阅读全文

作者:terhechte,原文链接,原文日期:2018-05-03
译者:BigLuo;校对:Ceenumbbbbb;定稿:Forelax

我想大家应该都会同意 Swift 是一门优秀的语言,很好的处理了那些简单与复杂的问题。理论上讲,它将会成为重要的编程语言之一。目前,Swift 的使用仅限于苹果开发领域(外加少量服务端 Swift 以及近期宣布的 Swift 版本的 Tensorflow)。

“My goal for Swift has always been and still is total world domination. It’s a modest goal”

“我一直期待着 Swift 统治世界,这是一个谦虚的目标。”

  • Chris Lattner

随着新的泛型特性在 Swift 4.1 中推出以及 ABI 在 Swift 5 中逐渐稳定,Swift 似乎逐渐具备了跳出苹果开发领域的条件。本文我会讨论一个我知道的问题,它阻碍着 Swift 广泛的应用,准确的讲,与其它问题一样,该问题也正在被开发社区着手解决。

阅读全文