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

作者: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 广泛的应用,准确的讲,与其它问题一样,该问题也正在被开发社区着手解决。

阅读全文

作者:Mattt,原文链接,原文日期:2018-08-13
译者:Damonwong;校对:LisionYousanflics;定稿:Forelax

当你在苹果商店预约天才吧服务后,相关工作人员会帮你登记并且安排特定的服务时间,在被带到座位上之后,工作人员会记录你的身份信息并添加到服务队列当中。

根据一份来自零售店某位前员工的报告表示,对于顾客的描述有着严格的指导方针。他们的外貌特征如:年龄、性别、种族、身高都没有被使用 —— 甚至连头发的颜色都没有被使用。而是通过顾客的着装来描述,例如“黑色的高领毛衣,牛仔裤和眼镜”。

这种描述顾客的方式和编程中的哈希函数有很多共同之处。同许多优秀的哈希函数一样,它是连续和易计算的,可用于快速找到你正在寻找的内容(或者人)。我想你肯定也觉得这样比队列要好用多了。

这周我们的主题是 Hashable 和相关的新类型 Hasher。它们共同组成了 Swift 最受喜爱的两个集合类 DictionarySet 的基础功能。

阅读全文

作者:Mike Ash,原文链接,原文日期:2018-06-29
译者:BigNerdCoding;校对:pmstnumbbbbb;定稿:Forelax

调试复杂问题本身就并不轻松,如果还没有足够的上下文和大致方向的话那就是一件非常困难的事。所以对代码进行精简缩小调试范围也就变成了一种常见的行为。不过与繁杂的手动简化相比,执行自动化处理程序明显更容易发挥计算机自身的优势。C-Reduce 正是为此而生,它能自动对原始代码进行简化操作输出一个简化的调试友好版本。下面我们看看如何使用该自动化程序。

阅读全文

作者:AppCoda,原文链接,原文日期:2018-07-11
译者:Hale;校对:liberalismannumbbbbbYousanflics;定稿:Forelax

在美国圣何塞举办的 2018 开发者大会上,苹果公布了 Siri Shortcuts,这是一个令人期待已久的功能,开发人员能够在自己的应用程序中扩展和增强 Siri 的功能。在这之前,SiriKit SDK 的功能非常有限。随着 Siri Shortcuts 的出现,开发人员可以扩展 Siri 的功能并通过构建自定义语音操作来唤起应用程序。

阅读全文

作者:Arthur Knopper,原文链接,原文日期:2017/10/30
译者:jojotov;校对:ForelaxCee;定稿:Forelax

几周前,一位读者指出了 Advanced Swift 中的一处错误。我们当时这样描述 Swift 中的 forEach 方法:

forEach 作为一系列链式调用中的一部分时确实可以大放异彩。举个例子,试想一下你在一个语句中通过链式调用的方式调用了几次 mapfilter 方法。在调试这段代码时,你希望能够打印出某几步操作中间的值。要达成这一目的,在你期望的位置插入一个 forEach 或许是最快速的解决方式。

当我写下这段描述时,众多美妙的想法涌现在我脑中,因为这听起来是个非常实用的特性[1](你并不能通过 for-in 循环达到这种效果)。可事实却如此的残酷 —— 你不能在一系列链式调用中间插入 forEach

阅读全文

作者:Andrew Jaffee,原文链接,原文日期:2018-07-24
译者:BigLuo;校对:pmstnumbbbbb;定稿:Forelax

“Gang of Four” (“GoF”) Erich Gamma,Richard Helm,Ralph Johonson,和 John Vlissides 在他们“设计模式:面向对象软件设计复用的基本原理” 的重要著作里整理了大概 23 种经典的设计模式 。本文会介绍 GoF 总结的两种创建型(creational)模式:工厂方法单例方法

阅读全文

作者:Mattt,原文链接,原文日期:2018-07-30
译者:雨谨;校对:numbbbbbwongzigii,Firecrest;定稿:CMB

Never 是一个约定,表示一件事在过去或未来的任何时段都不会发生。它是时间轴上的一种逻辑上的不可能,在任何方向延展开去都没有可能。这就是为什么在代码中看到 这样的注释 会特别让人不安。

阅读全文

作者:Andrew Jaffee,原文链接,原文日期:2018-02-14
译者:BigLuo;校对:numbbbbbmuhlenXi;定稿:CMB

问题 1:我能否写一个 Swift 函数用于查找在任意数组中存储的任意类型任何实例对象的位置\索引。

问题 2:我能否写一个 Swift 函数用于确定在任意数组中存储的任意类型任何实例对象的类型。

我所说的 “任何类型”,包括自定义类型,比如我们自己定义的 Class 类型。提示:我知道我能够用 Swift Array 类型的内置方法,如 indexcontains,但今天我将会用简单代码实例来说明 Swift 泛型中的一些特性。

阅读全文

作者:Sai Kambampati,原文链接,原文日期:2018-05-31
译者:小袋子;校对:liberalismnumbbbbb;定稿:CMB

区块链作为一项革命性的技术,开始受到越来越多追捧。为什么呢?因为区块链是许多加密数字货币的底层技术,比如:比特币(BTC),以太坊(ETH)以及莱特币(LTC)。区块链具体是如何工作的?本篇教程会涵盖所有区块链相关的知识,还会教你如何构建 Swift 区块链。下面让我们开始吧!

阅读全文

作者:codingexplorer,原文链接,原文日期:2018-07-18
译者:Khala-wan;校对:Yousanflicswongzigii;定稿:CMB

在 watchOS 1 时代,WatchKit Extension 位于已配对的 iOS 设备上,这使得宿主 APP 和 watch 之间的数据共享变得简单。类似偏好设置这种最简单的数据,只需要通过 App Groups 功能来存取 NSUserDefaults。目前在手机上留存的其他扩展程序和主 app 之间共享数据仍然应该使用这种方式,例如 Today View Extension,但它已不再适用于 watchOS 的 app。
幸运的是,苹果为我们提供了新的 API 来做这件事。相比 App Groups,Watch Connectivity 拥有更强大的功能。它不仅提供了你的 Apple Watch 和与其配对 iPhone 之间连接状态的更多信息,还允许它们之间进行交互消息和 3 种方式的后台传输,这些方式分别是:

  1. Application Context
  2. User Info Transfer
  3. File Transfer

我们今天先讨论第一种方式:Application Context。

阅读全文