kemchenj

Hackable life?

原文链接:SE-0302 Sendable and @Sendable closures

简介

Swift Concurrency 的其中一个关键目标就是“提供一种机制来隔离并发程序中的状态,以消除 data races”。这样的机制将会是通用编程语言的一次重大进步 – 大多数语言提供的并发编程抽象会使程序员面临范围宽广的 bug,包括 race conditions,死锁和其它问题。

这个提案里描述了一种方式,去解决这个领域面临的其中一个问题 – 如何对结构化并发和 Actor 消息传递的值进行类型检查。因此,这是一个统一的理论,它提供了一些基本的类型系统机制,使它们既保障安全又能很好地协同工作。

这种实现方式会提供一个名为 Sendable 的 marker 协议,以及一个可应用于函数的 @Sendable 注解。

阅读全文 »

原文链接:SE-0306 Actors

简介

Swift 并发模型计划提供一个安全的编程模型,静态地检测 data-races 和其他常见的并发错误。结构化并发提案引入了一种定义并发任务的方法,并为函数和闭包提供了安全的 data-race。这个模型适用于许多常见的设计模式,包括像 parallel maps 和并发回调模式,但只限于处理由闭包捕获的状态。

Swift 包含了 class,它提供了一种机制来声明整个程序共享的 mutable 状态。然而,class 在并发程序中难以正确使用,需要手动同步来避免 data race,很容易出错。我们希望提供这么一种功能,在使用共享的 mutable 状态的同时,仍然提供对 data race 和其他常见并发 bug 的静态检测。

Actor 模型定义了称为 actors 的实体,这些实体非常适合这项任务。Actor 允许你,作为一个程序员,声明一系列的状态,这些状态由一个 concurrency domain 持有,并且可以定义多个对其的操作。每个 actor 通过 data isolation 来保护自己的数据,确保在给定时间内只有一个线程访问它的数据,即使许多用户同时向 actor 发出请求。作为 Swift 并发模型的一部分,actor 提供了与结构化并发相同的 race 和内存安全属性,但也提供了 Swift 中其他显式声明的类型所享有的熟悉的抽象和复用的特性。

阅读全文 »

原文链接:SE-0300 Continuations for interfacing async tasks with synchronous code

简介

异步 Swift代 码需要能够与现有的同步代码一起工作,这些代码使用回调和 delegate 等方式来响应事件。异步任务可以在 continuations 上暂停自己,然后同步代码可以捕获并调用它来恢复任务以响应事件。

Swift-evolution thread:

阅读全文 »

原文链接:SE-0298 Async/Await: Sequences

简介

Swift 的 async/await 特性提供了一种直观的、内建的方式来编写和使用在未来某个时间点返回一个值的函数。我们建议在这个特性的基础上,添加一种直观的、内置的方式来编写和使用在一段时间内返回多个值的函数。

本提案由以下三个部分组成:

  1. 增加一个表示异步序列的协议到标准库里
  2. 在异步序列上使用 for...in 语法的编译器支持
  3. 对异步序列进行操作的通用函数的标准库实现
阅读全文 »

原文链接:SE-0297 Concurrency Interoperability with Objective-C

简介

Swift 的并发功能包括了异步函数和 actor。虽然 Objective-C 没有相应的语言特性,但异步 API 在 Objective-C 中很常见,通过使用 completion-handler 手动实现。本提案提供了 Swift 的并发特性(如 async 函数)和 Objective-C 中基于约定的异步函数表达之间的桥接。它的目的是让现有的丰富的异步 Objective-C API 可以立即与 Swift 的并发模型一起使用。

阅读全文 »

原文链接:SE-0296 async/await

简介

现代 Swift 开发涉及大量使用闭包和回调的异步编程,但这些 API 很难使用。当使用了许多异步操作,需要错误处理,或者异步调用之间的控制流变得复杂时,这就变得特别麻烦。这个提案描述了一种语言扩展,使之更自然,更不容易出错。

这份设计将 coroutine模型引入 Swift。函数可以选择成为 async,允许程序员使用正常的控制流机制来编写涉及异步操作的复杂逻辑。编译器负责将一个异步函数翻译成一套适当的闭包和状态机。

这个提案定义了异步函数的语义。然而,它并没有提供并发性:这在另一个引入结构化并发的提案里讨论,该提案将异步函数与并发执行的任务联系起来,并提供用于创建、查询和取消任务的 API。

Swift-evolution thread: Pitch #1, Pitch #2

阅读全文 »

原文链接:SE-0282 Low-Level Atomic Operations

译者注:

前两天 Apple 的团队发布了 swift-atomics,让我们可以用纯 Swift 代码实现高性能的无锁并发数据结构,这里我就把它的前身 SE-0282 Low-Level Atomic Operations 翻译出来,希望可以帮助大家更好地理解 swift-atomics,也欢迎留言指正。

本文翻译的这个版本与最终版本的提案有比较大的出入,提案在 Joe 的提议下,把 Atomics 作为一个独立的 Swift Package 发布出来,摆脱 API/ABI 稳定的顾虑,也不需要跟着 Swift 的发布周期走,可以快速地进行迭代。

并且这个版本的提案内容最终被拆分成了三个部分进行实现:

  • 对于编译器必要的修改作为私有功能直接合并到主分支里。
  • 对于内存模型的定义演变成 SE-0282 Clarify the Swift memory consistency model ⚛︎ 提案,并且优化了与 C Atomics 的交互,最终提案在 Swift 5.3 里完成了实现。
  • 核心的功能改为在 C Atomics 的基础上实现,作为 swift-atomics 发布出来。
阅读全文 »

虽然 Swift Package Manager 发布到现在已经四年了,但采用率一直很低,无法完全替代 Cocoapods,不过今年情况将会有所改善,SwiftPM 今年迎来两个非常重要的功能:

  1. 二进制依赖分发
  2. 资源文件
阅读全文 »

Swift 里的 String 繁琐难用的问题一直是大家频繁吐槽的点,趁着前两天 Swift 团队发了一份新的提案 SE-0265 Offset-Based Access to Indices, Elements, and Slices 来改善 String 的使用,我想跟大家分享一下自己的理解。

SE-0265 提案的内容并不难理解,主要是增加 API 去简化几个 Collection.subscript 函数的使用,但这个提案的背景故事就比较多了,看了这篇提案我思考了很多关于这个 API 相关的内容,我认为问题的核心在于 Collection.Index 的设计。

阅读全文 »

SwiftUI 作为今年 WWDC 的重头戏,惊艳之余我们还需要关注一下它是如何与现有的 UIKit / AppKit / WatchKit 进行交互,以便我们能够在将来更平滑无缝地接入到已有的代码里。

这个 Session 的内容偏向于 API 的介绍,主要内容如下:

  • 与原生框架的交互
    • 原生页面里嵌入 SwiftUI
    • SwiftUI 里嵌入原生页面
  • 集成已有的数据模型
  • 集成已有的系统功能
    • Drag & Drop
    • 复制粘贴
    • 焦点
    • Command
    • Undo & Redo
  • 总结

此外,这次苹果还推出了一系列的 SwiftUI 教程,其中一节的内容讲的就是与 UIKit 的交互,推荐与本文一同阅读。

阅读全文 »