前言
本期是 Swift 编辑组自主整理周报的第六十一期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。
Swift 周报在 GitHub 开源,欢迎提交 issue,投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。
其实根本就没有什么假如,每个人的人生都不会重新设计。Swift社区也有梦想,也懂现实,生气不如争气,改变胜过抱怨。
周报精选
新闻和社区:苹果 9 月 10 日举行今年最重磅新品发布会,iPhone 16 亮相?都有哪些看点?
提案:精确控制编译器警告的标志的提案正在审查中
Swift 论坛:提议讨论整数泛型参数
推荐博文:Swift 中的 Typed Throws
话题讨论:
如果微信不支持 iPhone 16,你选微信还是 Apple
上期话题结果
根据投票结果可以看出,超过一半的朋友希望 Apple 能更好地将 AI 与 Swift 和 Xcode 集成。期待 iPhone 16 的发布带来亮眼的新功能。
新闻和社区
苹果据称正洽谈投资 OpenAI 英伟达也有意跟投
2024 年 8 月 30 日
据媒体援引消息人士报道,两大科技巨头苹果公司和英伟达均有意投资人工智能(AI)研究公司 OpenAI。
周三有消息称,OpenAI 正在洽谈新一轮融资,计划以超过 1000 亿美元的估值筹集数十亿美元资金,风投公司兴盛资本(Thrive Capital)将领投此轮融资,投资达到 10 亿美元。此外,作为 OpenAI 最大股东,微软也将参与这轮融资。
知情人士称,苹果正就投资 OpenAI 进行谈判,英伟达也已讨论过加入对 OpenAI 的最新融资。据悉,英伟达商谈在 OpenAI 新一轮融资中投入 1 亿美元。
据悉,OpenAI 首席财务官 Sarah Friar 周三一份备忘录中表示,该公司正寻求新的融资,但没有透露具体细节。Friar 称,OpenAI 将利用这笔融资获得更多的计算能力,并为其他运营费用提供资金。
目前尚不清楚苹果和微软计划投资多少金额。如果相关谈判取得成功,这意味着全球最有价值的三家科技公司都将成为 OpenAI 的股东。
OpenAI 成立之初是一家非营利组织,该公司在 2019 年转为一家营利性初创企业。自那以来,微软共向 OpenAI 投资了 130 亿美元,拥有后者 49% 的股份。
苹果在今年 6 月的全球开发者大会(WWDC)上宣布推出苹果智能(Apple Intelligence)系统,该公司还官宣了和 OpenAI 的合作关系。
苹果当时宣布,准备在今年晚些时候将 OpenAI 的聊天机器人 ChatGPT 集成到系统平台中,包括 iOS 18、iPadOS 18 和 macOS Sequoia,由 GPT-4o 提供支持。
苹果多年来大量投资了代工伙伴,部分原因是为了确保其设备零部件的供应,但该公司很少投资初创企业。
相比之下,作为 AI 龙头股的英伟达在投资领域更为活跃。自 2023 年以来,英伟达旗下投资部门 NVentures 已投资了十多家AI制药企业。(来源:科技板日报)
消息称苹果公司服务部门将裁员约百人,波及 Apple Books / Apple News 等业务
2024 年 8 月 28 日
北京时间8月28日上午,据彭博社援引知情人士消息称,苹果公司宣布在其服务部门裁员约 100 人。
当地时间周二,苹果公司通知了受影响的员工,这些员工分别在高级副总裁 Eddy Cue 的服务部门的几个不同团队工作。此次裁员包括一些工程师职位,受到影响最多的是负责苹果 Apple Books 图书应用和苹果书店的团队。而与此同时,其他服务团队也在裁员,包括运营 Apple News 的团队。
报道称,Apple Books 已不再是公司的重点工作,也不再被视为服务阵容的"重要组成部分"。据知情人士透露,随着时间的推移,Apple Books 应用程序仍有望获得新的功能,但 Apple News 的裁员不意味其"不再受到重视"。
裁员在苹果公司并不常见。据IT之家此前报道,今年 4 月,苹果向美国加利福尼亚州提交的必要文件显示公司永久裁员 600 多人。外界认为,可能是苹果放弃汽车项目之后,2000 多人的开发团队中部分转岗到苹果其它项目,而这 600 多人被苹果裁员。(来源:IT之家)
苹果 9 月 10 日举行今年最重磅新品发布会,iPhone 16 亮相?都有哪些看点?
2024 年 8 月 23 日
知名科技记者马克·古尔曼当地时间 8 月 23 日发文称,苹果公司计划在 9 月 10 日举行今年最大的产品发布会,届时该公司将推出最新款 iPhone、Watch 和 AirPods。
古尔曼援引知情人士消息表示,虽然具体时间尚未公布,但该公司正在为这一天做准备。发布会之后,新款手机预计将于 9 月 20 日正式上市销售,这与苹果近年来的做法一致。
马克·古尔曼此前曾表示,有知情人士向他透露,苹果的洛杉矶新店正在为 9 月 16 日那一周开业全力准备。众所周知,苹果公司喜欢在新产品上市之际开新店。
按照以往规律,苹果在 9 月 10 日开完发布会后,要等到周五( 9 月 13 日)开启预订,那么一周后新 iPhone 正式上市的日子( 9 月 20 日)正好赶上洛杉矶新店开业。
对于新一代iPhone,有业内人士称,总体而言,iPhone 16 和 iPhone 15 不会有太大不同。上月苹果在 iPhone 15 的 Pro 以上机型"限量"上线了个人智能化系统 Apple Intelligence,iPhone 16 也将拥有这一先进人工智能(AI)技术加持的工具。此外,iPhone 16 的 Pro 机型屏幕会更大,会拥有新的照相功能,例如用于拍照的专用按钮。
iPhone 16 机型将搭载配合 Apple Intelligence 使用的更强大芯片 A18,整个 iPhone 16 系列都将支持新的 iOS 18。
iPhone 16 Pro 和 Pro Max 的显示屏会稍微大一些,尺寸分别为 6.3 英寸和 6.9 英寸。
整个 iPhone 16 系列机型都将有操作按钮(Action Button),这将是基本款的 iPhone 首次采用该按钮。
整个 iPhone 16 系列机型都将新增一个拍照按钮 Capture Button,位于右侧电源键下方。该按钮类似于数码相机上的快门按钮,轻按该按钮可自动对焦,让拍摄更精准,重按该按钮可直接完成拍照,用户在该按钮左右滑动可缩放画面,该按钮可切换拍照和录影功能。
iPhone 16 Pro 和 Pro Max 将配备 4800 万像素的超广角摄像头,像素较 iPhone 5 的 1200 万大幅提升。
相比 iPhone,苹果智能手表和耳机的变化可能更大。媒体称,Apple Watch Series 10 将比前代更薄,但屏幕更大。苹果将更新中低端的 AirPods 产品线,将首次在中端 AirPods 上提供降噪功能,将自 2019 年以来首次更新入门级的 Airpods。
对于苹果公司来说,这次产品发布非常关键,因为最近几个季度苹果的智能手机和可穿戴设备销量一直不太理想。
如果新的 iPhone 16 在 9 月 20 日上市,这意味着该设备的部分收入将计入第四财季财报,苹果预计这一财季营收将同比增长 5%。
而更大的销售份额则需要在下一个财季才能实现,分析师预测,在那个时期,恰逢假日季节,苹果营收将大幅增长 7%,达到 1284 亿美元。
在今年 6 月的年度开发者大会上,苹果公布了一项期待已久的人工智能战略,即将其最新人工智能技术整合到一系列应用程序中,并将 OpenAI 的聊天机器人 ChatGPT 引入其设备。
可穿戴设备也将迎来一些重大变化。据悉,Apple Watch Series 10 系列的型号将会更薄,但会配备更大的屏幕。预计新手表的起售价为 399 美元,并提供两种尺寸选择。
苹果还在更新其 AirPods 产品线,预计将推出新的中低端版本。据悉,这是苹果首次在中端 AirPods 上提供主动降噪 (ANC) 功能,而入门级型号则将进行 2019 年以来的首次更新。
该公司还计划今年晚些时候开始将其 Mac 电脑过渡到 M4 处理器,但 Mac 的更新通常要到 iPhone 发布会后一个月左右。
提案
正在审查的提案
SE-0443 精确控制编译器警告的标志 提案正在审查。
本提案引入了新的编译器选项,允许对编译器如何发出特定警告进行精细控制,使它们可以作为警告或错误来处理。
Swift论坛
- 提议整数泛型参数
内容大概
这篇讨论围绕通过引入整数泛型参数来增强 Swift 处理具有内联存储的固定容量数据结构的能力。对于像嵌入式 Swift 这样注重性能的代码库,这特别有用,在这些场景中,开发人员需要高效且类型安全的数据结构。目前,Swift 的局限性需要繁琐且容易出错的技术,例如手动创建具有特定元素数量的结构体,并使用不安全的操作进行索引。
动机:
这个提议的动机源于 Swift 缺乏对使用内联存储的固定大小或固定容量集合的原生支持。这些集合对于编译时容量固定的场景非常重要,例如固定大小的数组、具有固定桶数的哈希表或具有特定维度的矩阵。通过允许在泛型中使用整数参数,相同的实现可以在不同大小之间重用,从而提高代码的可重用性并确保更强的类型安全性。
提议的解决方案:
该提案引入了通过整数参数对泛型类型进行参数化的概念。这是通过在泛型参数列表中使用新的语法实现的,其中整数通过 let 关键字声明。例如:
Swift
struct Vector<let N: Int, T> { /* 实现待定 */ }
在这里,N 是一个字面整数参数,允许使用固定大小 N 定义 Vector 类型。这使得可以创建固定维度的矩阵或向量,例如:
Swift
struct Matrix4x4 {
var matrix: Vector<4, Vector<4, Double>>
}
详细设计:
- 声明语法:
- 整数泛型参数使用 let 关键字后跟参数名称和类型 Int 声明。
- 例如: struct Matrix<let N: Int, let M: Int> { ... }
- 实例化:
- 这些类型可以使用字面整数值实例化,也可以通过引用周围泛型上下文中的整数参数来实例化。
- 约束和算术:
- 提案允许在整数参数之间添加约束,例如确保两个参数相等或某个参数等于特定值。
- 未来的方向包括支持在这些泛型参数中进行算术运算,从而实现更复杂的关系,如组合向量或矩阵。
- 类型兼容性:
- 该设计通过扩展现有的泛型语法保持源代码兼容性。为值参数引入 let 确保了清晰性,并防止在将来引入不同类型的值参数时产生歧义。
- ABI 兼容性:
- 该提案不会影响现有 Swift 代码的 ABI,因为它引入了新功能,而不是改变现有行为。
未来方向:
该提案是 Swift 中迈向更高级功能的基础步骤:
- 固定大小和固定容量集合:
- 未来的提案可能会引入充分利用此功能的标准库类型,例如固定大小的数组或缓冲区。
- 泛型参数中的算术:
- 能够使用整数参数进行算术运算,例如将两个数组的维度相加以创建一个新数组。
- 非整数值泛型参数:
- 扩展该功能以允许其他类型的值参数,可能会在类型级别支持更丰富的约束和操作。
- 参数包:
- 未来的工作可能还会探索整数参数的可变参数包,这可能允许定义具有任意维度的多维数组或矩阵。
内容大概
Lokesh T.R 是来自印度 Chennai Vel Tech 大学的二年级学生,他参与了 2024 年的 Google Summer of Code (GSoC) 项目,专注于在 Visual Studio Code (VS Code) 中扩展 Swift 宏。在导师 Alex Hoppen 和 Adam Fowler 的指导下,Lokesh 的主要目标是实现一个代码操作,允许用户在 VS Code 编辑器中直接查看 Swift 宏的展开内容。
项目概述
该项目旨在通过引入一个新功能来增强 VS Code 中的 Swift 开发体验,即通过调用"Expand Macro"代码操作,将 Swift 宏展开并在"peeked"编辑器窗口中显示生成的内容。该功能将包含在与 Swift 6.1 捆绑的 SourceKit-LSP 中,并将在下一个 VS Code Swift 扩展版本中发布。
主要成就
- 引入新 LSP 扩展:
- workspace/peekDocuments: 这个 LSP 扩展允许 SourceKit-LSP 服务器在 VS Code 中的一个 peek 窗口中显示存储在特定位置的内容。
- workspace/getReferenceDocument: 这个扩展使得 VS Code Swift 扩展可以向 SourceKit-LSP 服务器请求并检索文档(例如 Swift 宏展开)的内容。
- 自定义 URL 方案:
- Lokesh 引入了一个新的自定义 URL 方案 (sourcekit-lsp://),用于编码生成任何形式内容(特别是 Swift 宏展开)所需的数据。引入的第一个文档类型是 swift-macro-expansion。
- 在 Peeked 编辑器中的宏展开:
- 当用户调用"Expand Macro"代码操作时,系统会使用 SourceKitD 为宏展开生成一个参考文档 URL,然后发出 workspace/peekDocuments 请求。这些内容随后将在 VS Code 的 peeked 编辑器中显示。
- 语义功能和嵌套宏展开:
- Lokesh 扩展了项目范围,支持在宏展开预览中进行语义功能(如跳转到定义、悬停时的快速帮助和语法高亮显示)。这是通过重新使用源文件的构建参数来欺骗 SourceKitD,使其为参考文档提供这些功能。
- 该系统还支持嵌套宏展开,其中在生成的宏展开中存在的宏本身也可以被展开。自定义参考文档 URL 通过允许每个宏展开引用其父级,从而促进了这种嵌套,使嵌套展开得以高效和无缝地进行。
- 支持其他基于 LSP 的编辑器:
- 虽然新 LSP 扩展最初是为 VS Code 设计的,但 Lokesh 致力于为其他基于 LSP 的编辑器(如 Neovim)提供基本的宏展开支持,使用标准的 LSP 请求。这使得这些编辑器能够显示宏展开,尽管形式更为简单,方法是将展开内容存储在临时文件中然后显示出来。
实施细节
实施过程中涉及到几个关键组件的紧密互动:
- VS Code-Swift 扩展: 作为 VS Code 和 SourceKit-LSP 之间的桥梁。
- SourceKit-LSP: 提供必要的编辑器功能,并通过 LSP 进行通信。
- SourceKitD: 嵌入在 Swift 编译器中的后台服务,提供宏展开所需的原始数据和操作。
为了实现项目目标,Lokesh 和他的导师引入了上述的自定义 LSP 扩展和 URL 方案,并确保这些功能平滑地集成到现有的 Swift 工具链和 VS Code 扩展中,注重用户体验和性能。
未来方向
- 测试用例和文档:
- Lokesh 计划实施涵盖各种嵌套宏级别所有语义功能的全面测试用例。这包括在 VS Code 中的端到端测试,以确保"Expand Macro"代码操作在真实世界场景中的稳健
内容大概
在 Swift 中,使用包含抛出函数的任务时,常见的问题是错误可能会被无意中忽略。这是因为当前的 Task 初始化器默认允许丢弃错误,这可能导致严重且难以发现的 bug。
当前行为:
当前的 Task 初始化器定义如下:
Swift
extension Task where Failure == any Error {
@discardableResult
public init(priority: TaskPriority? = nil, operation: sending @escaping @isolated(any) () async throws -> Success)
}
由于使用了 @discardableResult
属性,开发者可以忽略错误而不会收到任何警告,这可能导致关键错误被无意中忽略。
提议的更改:
提议中建议移除 Task 初始化器中的 @discardableResult
属性。这样一来,忽略错误将不再是默认行为,从而提高代码的安全性,确保开发者在必要时有意识地选择忽略错误。
例如,要有意忽略错误,开发者需要显式地写成:
Swift
_ = Task {
try await dontCareIfThisThrowsOrNot()
}
这一更改旨在引入警告,帮助发现潜在的 bug,提高代码的安全性,并减少无意中的错误处理遗漏。
论据:
作者指出,当前默认允许丢弃错误的行为在原始的 Swift 结构化并发提案中并没有得到充分的理由支持。鉴于它带来的问题,重新审视这一设计决策可能会提升代码的可靠性。
一个相关的讨论主题也指出了同样的问题,这表明 Swift 社区中的其他开发者也遇到了类似的挑战。
内容大概
在 Swift 中,结构体的内存布局由其存储属性的声明顺序决定。通过重新排列这些属性,可以减少结构体的 MemoryLayout.size 和 MemoryLayout.stride。这种优化看似有吸引力,但它的实际好处是什么呢?
主要好处:
- 存在类型优化:
- Swift 可以优化存在类型(Any 或 any P),如果类型的大小为 3 个机器字或更小(在 64 位机器上为 24 字节),则可以将值内联存储在存在类型中。通过优化结构体的布局以符合这一限制,可以避免在频繁使用这些类型时进行不必要的内存分配。
- "大型"类型的阈值:
- 如果类型超过 5 个机器字(在 64 位机器上为 40 字节),Swift 会将其视为"大型"并以不同方式传递,通常通过堆栈分配并传递指针。虽然这本身并不坏,但当复制该值时,这会导致增加的内存操作,从而影响性能。
- 汇编级别的考虑:
- 一些开发者希望使用更少的寄存器来表示类型(例如,2 个寄存器而不是 4 个),以实现代码大小和性能上的微小提升。然而,对于大多数开发者来说,这些问题微不足道,不值得过多关注。
- 讨论并发 101
内容大概
- 挂起点和线程切换
在 Swift 中,当使用 async/await 处理异步函数时,挂起点是关键。这些是你代码中的特定点,由 await 标记,函数可以在这些点暂停或"挂起"。在挂起期间,执行此函数的线程可以切换到其他任务。这一过程是 Swift 并发能力的一部分。
如果你的代码没有这些挂起点(即没有 await 调用),函数将从头到尾执行而不暂停。在这种情况下,线程将被"阻塞"在当前任务上,无法进行其他工作。重要的是,Swift 不会引入超出 await 显式定义的附加挂起点。这一设计确保了开发者可以依赖同步函数的可预测行为,并清楚地区分同步和异步函数。
- 并发 vs. 并行
- 并发 指的是任务可以独立进展的能力。然而,这并不一定意味着这些任务在同一时间运行。并发允许任务的执行交错进行,即多个任务正在进行中,但它们可能不会同时执行。
- 并行 则是任务实际在同一时间运行,通常是在不同线程上。当系统有多个线程可用时,可以实现任务的同时执行。
使用 async/await 时,并不能保证并行执行。例如,如果你在一个任务中有多个 await 调用(如 await a; await b; await c),它们将在该任务中按顺序执行,而不是并行执行。并行执行只能在有多个任务在不同线程上运行时发生。
- 执行交错
交错是一种允许任务共享单线程时间的技术。在像 Swift 的并发模型这样的协作多任务环境中,这一点非常重要。当一个任务到达 await 点并挂起时,它会让出线程,允许其他任务运行。这种交错使得即使在单线程环境中,任务也能被视为并发执行,尽管它们并未并行执行。
因此,并发是并行的前提条件,但它们并不相同。一个系统可以有并发任务,但这些任务可能不会并行执行,取决于运行时如何调度它们。
- 函数执行和误解
一个常见的误解是"并发函数"的概念。实际上,函数本身并不并发;而是任务的执行可以是并发的。单个线程一次只能执行一段代码。这意味着虽然多个任务可以同时进行,但在给定线程上一次只能执行一个任务。
async/await 的好处在于它简化了异步代码的结构,使其比传统的回调或续传样式更易于阅读和推理。它还通过允许任务暂停和让出控制来实现更好的资源管理,而不是不必要地阻塞线程。
总之,async/await 在 Swift 中通过挂起点、执行交错和明确区分同步与异步函数来支持高效的并发。虽然它支持并行,但这取决于多个线程的可用性和运行时的调度决策。
推荐博文
SwiftUI 中 View 之间的通信 【macOS App】
摘要: 这篇博客探讨了 SwiftUI 中视图之间的通信方式,并与前端框架如 Vue 和 React 进行对比。文章首先介绍了父视图传递消息给子视图的方式,类似于 Vue 的 props,但使用方法有所不同。接着,文章讲述了子视图如何向父视图传递消息,分别介绍了使用 @Binding、闭包(Closure)回调函数、以及共享 Observable 数据的方式。最后,文章讨论了在多层级视图间使用环境变量传递消息的方式,类似于 Vue 的 Inject/Provide 和 React 的 context。作者总结认为,尽管 SwiftUI 提供了多种视图通信方式,但其灵活性和易用性与前端框架相比仍有所不足,尤其是在复杂场景下依然需要结合使用 Combine。
摘要: 这篇博客详细探讨了 Swift 协议中 some 和 any 两种关键字的使用及其背后的类型系统。文章首先解释了为什么使用带有关联类型的协议时会出现编译错误,并介绍了三种解决方案:使用 any 关键字创建装箱类型(Boxed Type)、使用泛型、以及使用 some 关键字创建不透明类型(Opaque Type)。
文章深入分析了不透明类型的作用,强调 some 关键字在编译时确定类型,但对外隐藏具体实现,适合简化 API 复杂性并提升性能。同时,文章也讨论了装箱类型的特性,指出 any 关键字在运行时确定具体类型,虽然灵活但有一定的性能开销。
作者强调了在不同场景下选择 some 或 any 的重要性,指出 some 适合编译时能确定类型的场景,而 any 则适合需要运行时确定类型的情况。了解这两者的区别对编写高效、简洁的 Swift 代码至关重要。
摘要: 这篇博客介绍了 Swift 6.0 中的新功能"Typed Throws"。过去,Swift 的错误抛出机制无法显式指定可能抛出的错误类型,开发者需要手动检查函数实现以了解错误类型。Swift 6.0 引入了"typed throws",允许开发者在定义函数时明确指定抛出的错误类型,使代码更具可预测性和类型安全性。这一特性不强制要求使用,可以与旧的错误抛出方式兼容。博客还讨论了向后兼容性,解释了 Swift 编译器如何将未指定错误类型的抛出函数转换为使用 any Error 类型。通过这项改进,开发者能够更清晰地处理特定的错误类型,提高代码的可读性和安全性。
话题讨论
如果微信不支持 iPhone 16,你选微信还是 Apple
1、微信 2、Apple
关于我们
Swift社区 是由 Swift 爱好者共同维护的公益组织,我们在国内以微信公众号的运营为主,我们会分享以 Swift实战 、SwiftUl 、Swift基础为核心的技术内容,也整理收集优秀的学习资料。
特别感谢 Swift社区 编辑部的每一位编辑,感谢大家的辛苦付出,为 Swift社区 提供优质内容,为 Swift 语言的发展贡献自己的力量。